三角形面积
已知三角形三个顶点在直角坐标系下的坐标分别为:
(2.3, 2.5)
(6.4, 3.1)
(5.1, 7.2)
求该三角形的面积。
注意,要提交的是一个小数形式表示的浮点数。
要求精确到小数后3位,如不足3位,需要补零。
Ideas
这道题给了三个点,要求三角形的面积,这其实是一个数学问题。
- 海伦公式
海伦公式是由古希腊的数学家海伦发现的,它的原理是利用三角形的三条边长求三角形的面积。
S = s ( s − a ) ( s − b ) ( s − c ) 其中 s = a + b + c 2 S=\sqrt{s(s-a)(s-b)(s-c)} \quad \text{其中} s=\frac{a+b+c}{2} S=s(s−a)(s−b)(s−c)其中s=2a+b+c
所以如果想用海伦公式求解这道题,我还需要计算三角形三条边的边长,这就是个两点之间的距离公式了。
∣ A B ∣ = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 |AB|=\sqrt{\left(x_{1}-x_{2}\right)^{2}+\left(y_{1}-y_{2}\right)^{2}} ∣AB∣=(x1−x2)2+(y1−y2)2
然后直接编程就可以了。
- 利用行列式
我们也可以使用解析几何和向量表达三角形的面积公式,把三角形放置在一个平面直角坐标系中,三点坐标A(x1, y1),B(x2, y2),C(x3, y3)。
三角形ABC的面积,其实等于它的外接矩形的面积,减去三个小三角形的面积,其中矩形的面积使用底乘高的公式,三角形的面积使用底乘高的一半。
S Δ = S − S 1 − S 2 − S 3 S = ∣ x 3 − x 1 ∣ ⋅ ∣ y 3 − y 2 ∣ S 1 = 1 2 ∣ x 3 − x 1 ∣ ⋅ ∣ y 3 − y 1 ∣ S 2 = 1 2 ∣ x 2 − x 1 ∣ ⋅ ∣ y 2 − y 1 ∣ S 3 = 1 2 ∣ x 3 − x 2 ∣ ⋅ ∣ y 3 − y 2 ∣ \begin{array}{l} S_{\Delta}=S-S_{1}-S_{2}-S_{3} \\ S=\left|x_{3}-x_{1}\right| \cdot\left|y_{3}-y_{2}\right| \\ S_{1}=\frac{1}{2}\left|x_{3}-x_{1}\right| \cdot\left|y_{3}-y_{1}\right| \\ S_{2}=\frac{1}{2}\left|x_{2}-x_{1}\right| \cdot\left|y_{2}-y_{1}\right| \\ S_{3}=\frac{1}{2}\left|x_{3}-x_{2}\right| \cdot\left|y_{3}-y_{2}\right| \end{array} SΔ=S−S1−S2−S3S=∣x3−x1∣⋅∣y3−y2∣S1=21∣x3−x1∣⋅∣y3−y1∣S2=21∣x2−x1∣⋅∣y2−y1∣S3=21∣x3−x2∣⋅∣y3−y2∣
经过整理可以得到行列式:
S = 1 2 ∣ x 1 y 1 1 x 2 y 2 1 x 3 y 3 1 ∣ S=\frac{1}{2}\left|\begin{array}{lll} x_{1} & y_{1} & 1 \\ x_{2} & y_{2} & 1 \\ x_{3} & y_{3} & 1 \end{array}\right| S=21∣∣∣∣∣∣x1x2x3y1y2y3111∣∣∣∣∣∣
可以得到三点面积公式:
S = 1 2 ( x 1 y 2 − x 1 y 3 + x 2 y 3 − x 2 y 1 + x 3 y 1 − x 2 y 2 ) S=\frac{1}{2} (x_1y_2-x_1y_3+x_2y_3-x_2y_1+x_3y_1-x_2y_2) S=21(x1y2−x1y3+x2y3−x2y1+x3y1−x2y2)
Code
C++
#include <iostream>
#include <cmath>
using namespace std;
double length(double x1,double y1,double x2,double y2) {
return sqrt(pow((x1 - x2), 2) + pow((y1 - y2), 2));
}
int main() {
double ax = 2.3, ay = 2.5, bx = 6.4, by = 3.1, cx = 5.1, cy = 7.2;
double a = length(ax, ay, bx, by), b = length(ax, ay, cx, cy), c = length(bx, by, cx, cy);
double len = (a + b + c) / 2;
cout << sqrt(len * (len - a) * (len - b) * (len - c));
return 0;
}
Python
if __name__ == '__main__':
x1, y1 = 2.3, 2.5
x2, y2 = 6.4, 3.1
x3, y3 = 5.1, 7.2
print((x1 * y2 + x2 * y3 + x3 * y1 - x1 * y3 - x2 * y1 - x3 * y2) / 2)