【题目链接】
ybt 1034:计算三角形面积
OpenJudge NOI 1.3 17:计算三角形面积
【题目考点】
1. 已知三点求三角形面积公式
已知三点分别为
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
(
x
3
,
y
3
)
(x_1,y_1), (x_2,y_2), (x_3,y_3)
(x1,y1),(x2,y2),(x3,y3)
先给出结论:这三个点围成的三角形的面积为:
S
=
1
2
∣
x
1
y
2
+
x
2
y
3
+
x
3
y
1
−
x
1
y
3
−
x
2
y
1
−
x
3
y
2
∣
S=\frac{1}{2}|x_1y_2+x_2y_3+x_3y_1-x_1y_3-x_2y_1-x_3y_2|
S=21∣x1y2+x2y3+x3y1−x1y3−x2y1−x3y2∣
推导过程:
- 记 a ⃗ = ( x 2 − x 1 , y 2 − y 1 ) , b ⃗ = ( x 3 − x 1 , y 3 − y 1 ) \vec{a} = (x_2-x_1,y_2-y_1), \vec{b} = (x_3-x_1,y_3-y_1) a=(x2−x1,y2−y1),b=(x3−x1,y3−y1)
- 已知向量点积公式
a
⃗
⋅
b
⃗
=
∣
a
⃗
∣
∣
b
⃗
∣
c
o
s
θ
\vec{a} \cdot \vec{b} = |\vec{a}||\vec{b}|cos\theta
a⋅b=∣a∣∣b∣cosθ,其中
θ
\theta
θ是向量
a
⃗
,
b
⃗
\vec{a}, \vec{b}
a,b的夹角。
有 c o s θ = a ⃗ ⋅ b ⃗ ∣ a ⃗ ∣ ∣ b ⃗ ∣ cos\theta = \frac{\vec{a} \cdot \vec{b}}{|\vec{a}||\vec{b}|} cosθ=∣a∣∣b∣a⋅b - 已知
s
i
n
2
θ
+
c
o
s
2
θ
=
1
sin^2\theta + cos^2\theta = 1
sin2θ+cos2θ=1,且
θ
<
π
\theta<\pi
θ<π
有 s i n θ = 1 − c o n s 2 θ = ( ∣ a ⃗ ∣ ∣ b ⃗ ∣ ) 2 − ( a ⃗ ⋅ b ⃗ ) 2 ∣ a ⃗ ∣ ∣ b ⃗ ∣ sin\theta = \sqrt{1-cons^2\theta} = \frac{\sqrt{(|\vec{a}||\vec{b}|)^2 - (\vec{a} \cdot \vec{b})^2}}{|\vec{a}||\vec{b}|} sinθ=1−cons2θ=∣a∣∣b∣(∣a∣∣b∣)2−(a⋅b)2 - 已知三角形面积公式:
S
=
1
2
∣
a
⃗
∣
∣
b
⃗
∣
s
i
n
θ
S = \frac{1}{2}|\vec{a}||\vec{b}|sin\theta
S=21∣a∣∣b∣sinθ
有 S = 1 2 ∣ a ⃗ ∣ ∣ b ⃗ ∣ ( ∣ a ⃗ ∣ ∣ b ⃗ ∣ ) 2 − ( a ⃗ ⋅ b ⃗ ) 2 ∣ a ⃗ ∣ ∣ b ⃗ ∣ = 1 2 ( ∣ a ⃗ ∣ ∣ b ⃗ ∣ ) 2 − ( a ⃗ ⋅ b ⃗ ) 2 \begin{aligned} S &= \frac{1}{2}|\vec{a}||\vec{b}|\frac{\sqrt{(|\vec{a}||\vec{b}|)^2 - (\vec{a} \cdot \vec{b})^2}}{|\vec{a}||\vec{b}|}\\ &= \frac{1}{2}\sqrt{(|\vec{a}||\vec{b}|)^2 - (\vec{a} \cdot \vec{b})^2}\\ \end{aligned} S=21∣a∣∣b∣∣a∣∣b∣(∣a∣∣b∣)2−(a⋅b)2=21(∣a∣∣b∣)2−(a⋅b)2 -
∣
a
⃗
∣
=
(
x
2
−
x
1
)
2
+
(
y
2
−
y
1
)
2
|\vec{a}| = \sqrt{(x_2-x_1)^2+(y_2-y_1)^2}
∣a∣=(x2−x1)2+(y2−y1)2
∣ b ⃗ ∣ = ( x 3 − x 1 ) 2 + ( y 3 − y 1 ) 2 |\vec{b}| = \sqrt{(x_3-x_1)^2+(y_3-y_1)^2} ∣b∣=(x3−x1)2+(y3−y1)2
a ⃗ ⋅ b ⃗ = ( x 2 − x 1 ) ( x 3 − x 1 ) + ( y 2 − y 1 ) ( y 3 − y 1 ) \vec{a} \cdot \vec{b} = (x_2-x_1)(x_3-x_1)+(y_2-y_1)(y_3-y_1) a⋅b=(x2−x1)(x3−x1)+(y2−y1)(y3−y1) - 根据以上公式:
S
=
1
2
(
∣
a
⃗
∣
∣
b
⃗
∣
)
2
−
(
a
⃗
⋅
b
⃗
)
2
S = \frac{1}{2}\sqrt{(|\vec{a}||\vec{b}|)^2 - (\vec{a} \cdot \vec{b})^2}
S=21(∣a∣∣b∣)2−(a⋅b)2
已经可以做到输入 x 1 , y 1 , x 2 , y 2 , x 3 , y 3 x_1,y_1, x_2,y_2, x_3,y_3 x1,y1,x2,y2,x3,y3,求S。
继续化归:
设 x 21 = x 2 − x 1 , x 31 = x 3 − x 1 , y 21 = y 2 − y 1 , y 31 = y 3 − y 1 x_{21}=x_2-x_1,x_{31}=x_3-x_1,y_{21}=y_2-y_1,y_{31}=y_3-y_1 x21=x2−x1,x31=x3−x1,y21=y2−y1,y31=y3−y1,
∣ a ⃗ ∣ = ( x 2 − x 1 ) 2 + ( y 2 − y 1 ) 2 = x 21 2 + y 21 2 |\vec{a}| = \sqrt{(x_2-x_1)^2+(y_2-y_1)^2}=\sqrt{x_{21}^2+y_{21}^2} ∣a∣=(x2−x1)2+(y2−y1)2=x212+y212
∣ b ⃗ ∣ = ( x 3 − x 1 ) 2 + ( y 3 − y 1 ) 2 = x 32 2 + y 32 2 |\vec{b}| = \sqrt{(x_3-x_1)^2+(y_3-y_1)^2}=\sqrt{x_{32}^2+y_{32}^2} ∣b∣=(x3−x1)2+(y3−y1)2=x322+y322
( ∣ a ⃗ ∣ ∣ b ⃗ ∣ ) 2 = ( x 21 2 + y 21 2 ⋅ x 31 2 + y 31 2 ) 2 = ( x 21 2 + y 21 2 ) ( x 31 2 + y 31 2 ) = x 21 2 x 31 2 + x 21 2 y 31 2 + y 21 2 x 31 2 + y 21 2 y 31 2 (|\vec{a}||\vec{b}|)^2=(\sqrt{x_{21}^2+y_{21}^2}\cdot \sqrt{x_{31}^2+y_{31}^2})^2=(x_{21}^2+y_{21}^2)(x_{31}^2+y_{31}^2)\\ =x_{21}^2x_{31}^2+x_{21}^2y_{31}^2+y_{21}^2x_{31}^2+y_{21}^2y_{31}^2 (∣a∣∣b∣)2=(x212+y212⋅x312+y312)2=(x212+y212)(x312+y312)=x212x312+x212y312+y212x312+y212y312
( a ⃗ ⋅ b ⃗ ) 2 = ( x 21 x 31 + y 21 y 31 ) 2 = x 21 2 x 31 2 + y 21 2 y 31 2 + 2 x 21 x 31 y 21 y 31 (\vec{a} \cdot \vec{b})^2=(x_{21}x_{31}+y_{21}y_{31})^2\\ =x_{21}^2x_{31}^2+y_{21}^2y_{31}^2+2x_{21}x_{31}y_{21}y_{31} (a⋅b)2=(x21x31+y21y31)2=x212x312+y212y312+2x21x31y21y31
( ∣ a ⃗ ∣ ∣ b ⃗ ∣ ) 2 − ( a ⃗ ⋅ b ⃗ ) 2 = x 21 2 y 31 2 + y 21 2 x 31 2 − 2 x 21 x 31 y 21 y 31 = ( x 21 y 31 − y 21 x 31 ) 2 (|\vec{a}||\vec{b}|)^2-(\vec{a} \cdot \vec{b})^2=x_{21}^2y_{31}^2+y_{21}^2x_{31}^2-2x_{21}x_{31}y_{21}y_{31}=(x_{21}y_{31}-y_{21}x_{31})^2 (∣a∣∣b∣)2−(a⋅b)2=x212y312+y212x312−2x21x31y21y31=(x21y31−y21x31)2
S = 1 2 ( ∣ a ⃗ ∣ ∣ b ⃗ ∣ ) 2 − ( a ⃗ ⋅ b ⃗ ) 2 = 1 2 ( x 21 y 31 − y 21 x 31 ) 2 = 1 2 ∣ x 21 y 31 − y 21 x 31 ∣ S=\frac{1}{2}\sqrt{(|\vec{a}||\vec{b}|)^2 - (\vec{a} \cdot \vec{b})^2}\\\ =\frac{1}{2}\sqrt{(x_{21}y_{31}-y_{21}x_{31})^2}\\ =\frac{1}{2}|x_{21}y_{31}-y_{21}x_{31}| S=21(∣a∣∣b∣)2−(a⋅b)2 =21(x21y31−y21x31)2=21∣x21y31−y21x31∣
因此三角形面积S可以表示为:
S
=
1
2
∣
(
x
2
−
x
1
)
(
y
3
−
y
1
)
−
(
x
3
−
x
1
)
(
y
2
−
y
1
)
∣
S
=
1
2
∣
x
1
y
2
+
x
2
y
3
+
x
3
y
1
−
x
1
y
3
−
x
2
y
1
−
x
3
y
2
∣
S
=
1
2
∣
x
1
(
y
2
−
y
3
)
+
x
2
(
y
3
−
y
1
)
+
x
3
(
y
1
−
y
2
)
∣
S=\frac{1}{2}|(x_2-x_1)(y_3-y_1)-(x_3-x_1)(y_2-y_1)|\\ S=\frac{1}{2}|x_1y_2+x_2y_3+x_3y_1-x_1y_3-x_2y_1-x_3y_2|\\ S=\frac{1}{2}|x_1(y_2-y_3)+x_2(y_3-y_1)+x_3(y_1-y_2)|
S=21∣(x2−x1)(y3−y1)−(x3−x1)(y2−y1)∣S=21∣x1y2+x2y3+x3y1−x1y3−x2y1−x3y2∣S=21∣x1(y2−y3)+x2(y3−y1)+x3(y1−y2)∣
2. 海伦公式:已知三条边的长度求三角形面积
设
a
=
∣
a
⃗
∣
,
b
=
∣
b
⃗
∣
,
c
=
∣
c
⃗
∣
a = |\vec{a}|, b = |\vec{b}|, c = |\vec{c}|
a=∣a∣,b=∣b∣,c=∣c∣,
已知
a
⃗
=
(
x
2
−
x
1
,
y
2
−
y
1
)
,
b
⃗
=
(
x
3
−
x
1
,
y
3
−
y
1
)
,
c
⃗
=
(
x
3
−
x
2
,
y
3
−
y
2
)
\vec{a} = (x_2-x_1,y_2-y_1), \vec{b} = (x_3-x_1,y_3-y_1), \vec{c} = (x_3-x_2,y_3-y_2)
a=(x2−x1,y2−y1),b=(x3−x1,y3−y1),c=(x3−x2,y3−y2)
有:
-
a
=
∣
a
⃗
∣
=
(
x
2
−
x
1
)
2
+
(
y
2
−
y
1
)
2
a = |\vec{a}| = \sqrt{(x_2-x_1)^2+(y_2-y_1)^2}
a=∣a∣=(x2−x1)2+(y2−y1)2
b = ∣ b ⃗ ∣ = ( x 3 − x 1 ) 2 + ( y 3 − y 1 ) 2 b = |\vec{b}| = \sqrt{(x_3-x_1)^2+(y_3-y_1)^2} b=∣b∣=(x3−x1)2+(y3−y1)2
c = ∣ c ⃗ ∣ = ( x 3 − x 2 ) 2 + ( y 3 − y 2 ) 2 c = |\vec{c}| = \sqrt{(x_3-x_2)^2+(y_3-y_2)^2} c=∣c∣=(x3−x2)2+(y3−y2)2 - 半周长 p = 1 2 ( a + b + c ) p = \frac{1}{2}(a+b+c) p=21(a+b+c)
- 海伦公式,三角形面积 S = p ( p − a ) ( p − b ) ( p − c ) S = \sqrt{p(p-a)(p-b)(p-c)} S=p(p−a)(p−b)(p−c)
3. 求一个数的绝对值
- 求整数的绝对值:
int abs(int a);
- 求浮点型数的绝对值:
double fabs(double a);
【题解代码】
解法1:用公式 S = 1 2 ( ∣ a ⃗ ∣ ∣ b ⃗ ∣ ) 2 − ( a ⃗ ⋅ b ⃗ ) 2 S = \frac{1}{2}\sqrt{(|\vec{a}||\vec{b}|)^2 - (\vec{a} \cdot \vec{b})^2} S=21(∣a∣∣b∣)2−(a⋅b)2
#include <bits/stdc++.h>
using namespace std;
int main()
{
double x1,y1,x2,y2,x3,y3,a_m,b_m,adotb,res;
cin>>x1>>y1>>x2>>y2>>x3>>y3;
a_m = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));//|a|
b_m = sqrt((x3-x1)*(x3-x1) + (y3-y1)*(y3-y1));//|b|
adotb = (x2-x1)*(x3-x1)+(y2-y1)*(y3-y1);//a点乘b
res = 0.5 * sqrt(a_m*b_m*a_m*b_m-adotb*adotb);//结果
cout<<fixed<<setprecision(2)<<res<<endl;
return 0;
}
解法2:用公式 S = 1 2 ∣ x 1 y 2 + x 2 y 3 + x 3 y 1 − x 1 y 3 − x 2 y 1 − x 3 y 2 ∣ S=\frac{1}{2}|x_1y_2+x_2y_3+x_3y_1-x_1y_3-x_2y_1-x_3y_2| S=21∣x1y2+x2y3+x3y1−x1y3−x2y1−x3y2∣
#include <bits/stdc++.h>
using namespace std;
int main()
{
double x1,y1,x2,y2,x3,y3;
cin>>x1>>y1>>x2>>y2>>x3>>y3;
cout<<fixed<<setprecision(2)<<fabs((x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2))/2;
return 0;
}
解法3:用海伦公式 S = p ( p − a ) ( p − b ) ( p − c ) S = \sqrt{p(p-a)(p-b)(p-c)} S=p(p−a)(p−b)(p−c)
#include <bits/stdc++.h>
using namespace std;
int main()
{
double x1,y1,x2,y2,x3,y3,a,b,c,p;
cin>>x1>>y1>>x2>>y2>>x3>>y3;
a = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));//|a|
b = sqrt((x3-x1)*(x3-x1) + (y3-y1)*(y3-y1));//|b|
c = sqrt((x3-x2)*(x3-x2) + (y3-y2)*(y3-y2));//|c|
p = (a + b + c)/2;//p半周长
cout<<fixed<<setprecision(2)<<sqrt(p*(p-a)*(p-b)*(p-c))<<endl;
return 0;
}