边长
已知三边求面积,最简便的方法就是用海伦公式
海伦公式: S = p ( p − a ) ( p − b ) ( p − c ) p = a + b + c 2 S=\sqrt{p(p-a)(p-b)(p-c)} \qquad p=\frac{a+b+c}{2} S=p(p−a)(p−b)(p−c)p=2a+b+c
上代码:
a,b,c = 12, 5, 13
p = (a+b+c)/2
S = (p*(p-a)*(p-b)*(p-c))**0.5
print("三角形的面积是:",s1)
坐标
二维空间
已知平面上三点的坐标,
A
=
(
x
1
,
y
1
)
B
=
(
x
2
,
y
2
)
C
=
(
x
3
,
y
3
)
A=(x_1,y_1) \ \ B=(x_2,y_2) \ \ C=(x_3,y_3) \quad
A=(x1,y1) B=(x2,y2) C=(x3,y3) 那么三角形ABC的有向面积
S
△
A
B
C
S_{\bigtriangleup ABC}
S△ABC计算如下:
S
△
A
B
C
=
1
2
∣
x
1
y
1
1
x
2
y
2
1
x
3
y
3
1
∣
=
1
2
∣
x
2
−
x
1
y
2
−
y
1
x
3
−
x
1
y
3
−
y
1
∣
S_{\bigtriangleup ABC}=\frac{1}{2}\left| \begin{matrix} x_1 & y_1 & 1 \\ x_2 & y_2 & 1 \\ x_3 & y_3 & 1 \\ \end{matrix} \right|=\frac{1}{2}\left| \begin{matrix} x_2-x_1 & y_2-y_1 \\ x_3-x_1 & y_3-y_1 \end{matrix} \right|
S△ABC=21∣∣∣∣∣∣x1x2x3y1y2y3111∣∣∣∣∣∣=21∣∣∣∣x2−x1x3−x1y2−y1y3−y1∣∣∣∣
import math
import numpy as np
# 三个点的平面坐标
x1, y1 = 21, 1
x2, y2 = 11, 12
x3, y3 = -21, -5
xoy = [[x1,y1,1],
[x2,y2,1],
[x3,y3,1]]
# 计算二阶和三阶行列式
def detValue(mat):
if len(mat)==3:
z = mat[0][0]*mat[1][1]*mat[2][2] + mat[0][1]*mat[1][2]*mat[2][0] + mat[0][2]*mat[1][0]*mat[2][1]
f = mat[0][2]*mat[1][1]*mat[2][0] + mat[0][1]*mat[1][0]*mat[2][2] + mat[0][0]*mat[1][2]*mat[2][1]
return z-f
else:
return mat[0][0]*mat[1][1] - mat[0][1]*mat[1][0]
# 计算xoy平面三角形的面积
# 1、通过三边求面积
a = math.sqrt((x1-x2)**2+(y1-y2)**2)
b = math.sqrt((x1-x3)**2+(y1-y3)**2)
c = math.sqrt((x3-x2)**2+(y3-y2)**2)
p = 0.5*(a+b+c)
s1 = math.sqrt(p*(p-a)*(p-b)*(p-c))
# 2、通过向量叉乘求面积
s2 = 0.5*detValue(xoy)
# s22 = 0.5*np.linalg.det(np.array(xoy)) # 用np库计算会带一连串的小数,所以我一般不用
# 3、通过向量叉乘求面积
det = [[x2-x1,y2-y1],
[x3-x1,y3-y1]]
s3 = 0.5 * detValue(det)
# s33 = 0.5*np.linalg.det(det)
三维空间
已知平面上三点的坐标, A = ( x 1 , y 1 , z 1 ) B = ( x 2 , y 2 , z 2 ) C = ( x 3 , y 3 , z 3 ) A=(x_1,y_1,z_1) \ \ B=(x_2,y_2,z_2) \ \ C=(x_3,y_3,z_3) \qquad A=(x1,y1,z1) B=(x2,y2,z2) C=(x3,y3,z3)
这里先声明一下: S △ A B C ≠ 1 2 ∣ x 1 y 1 z 1 x 2 y 2 z 2 x 3 y 3 z 3 ∣ S △ A B C = 1 2 ∣ α ⃗ × β ⃗ ∣ S_{\bigtriangleup ABC}\neq\frac{1}{2}\left| \begin{matrix} x_1 & y_1 & z_1 \\ x_2 & y_2 & z_2 \\ x_3 & y_3 & z_3 \\ \end{matrix} \right| \qquad S_{\bigtriangleup ABC}=\frac{1}{2}|\vec{\alpha} \times\vec{\beta}| S△ABC=21∣∣∣∣∣∣x1x2x3y1y2y3z1z2z3∣∣∣∣∣∣S△ABC=21∣α×β∣
import math
import numpy as np
# 三个点的空间坐标
x1, y1, z1 = 21, 1, 23
x2, y2, z2 = 11, 12, 22
x3, y3, z3 = -21, -5, 8
# 计算空间坐标系中三角形的面积
# 1、通过三边求面积
a = math.sqrt((x1-x2)**2+(y1-y2)**2+(z1-z2)**2)
b = math.sqrt((x1-x3)**2+(y1-y3)**2+(z1-z3)**2)
c = math.sqrt((x3-x2)**2+(y3-y2)**2+(z3-z2)**2)
p = 0.5*(a+b+c)
s1 = math.sqrt(p*(p-a)*(p-b)*(p-c))
# 空间中的三角形不能直接写成行列式直接计算
# 3、通过向量叉乘求面积
alphax,alphay,alphaz = x2-x1,y2-y1,z2-z1
betax,betay,betaz = x3-x1,y3-y1,z3-z1
# alpha 叉乘 beta = 一个新向量,它的坐标记为(x,y,z) ,那么 s3=0.5*math.sqrt(x*x+y*y+z*z)
# x=alphay*betaz-alphaz*betay y=alphaz*betax-alphax*betaz z=alphax*betay-alphay*betax
mo2 = (alphay*betaz-alphaz*betay)**2+(alphaz*betax-alphax*betaz)**2+(alphax*betay-alphay*betax)**2
s3=0.5*math.sqrt(mo2)
原理
用向量求面积大体分两种,一种用向量的点乘,一种用向量的叉乘。
向量的点乘: 用点乘求夹角余弦值(用余弦定理也能求),然后求出正弦值,再然后 S = 1 2 a b sin θ S=\frac{1}{2}ab\sin\theta S=21absinθ。求余弦值的时候无论用哪种方法,都没海伦公式简单。
向量的叉乘: 先了解一下, a ⃗ ⋅ b ⃗ \vec{a} \cdot \vec{b} a⋅b 结果是一个数。 a ⃗ × b ⃗ \vec{a} \times \vec{b} a×b 结果是一个向量,而这个向量的模等于,以向量a、b为邻边构成的平行四边形的面积。
a ⃗ ⋅ b ⃗ = ∣ a ⃗ ∣ ∣ b ⃗ ∣ cos θ ∣ a ⃗ × b ⃗ ∣ = ∣ a ⃗ ∣ ∣ b ⃗ ∣ sin θ S △ A B C = 1 2 ∣ a ⃗ ∣ ∣ b ⃗ ∣ sin θ \vec{a} \cdot \vec{b}=|\vec{a}||\vec{b}|\cos \theta \qquad |\vec{a} \times \vec{b}|=|\vec{a}||\vec{b}|\sin \theta \qquad S_{\bigtriangleup ABC}=\frac{1}{2}|\vec{a}||\vec{b}|\sin \theta a⋅b=∣a∣∣b∣cosθ∣a×b∣=∣a∣∣b∣sinθS△ABC=21∣a∣∣b∣sinθ
所以无论三个点的坐标,是平面直角坐标还是空间直角坐标,都可以用向量的叉乘来求面积。只不过平面坐标可以走个捷径,能直接写成行列式的形式 S △ A B C = 1 2 ∣ x 1 y 1 1 x 2 y 2 1 x 3 y 3 1 ∣ S_{\bigtriangleup ABC}=\frac{1}{2}\left| \begin{matrix} x_1 & y_1 & 1 \\ x_2 & y_2 & 1 \\ x_3 & y_3 & 1 \\ \end{matrix} \right| S△ABC=21∣∣∣∣∣∣x1x2x3y1y2y3111∣∣∣∣∣∣,最后结果取绝对值。但空间坐标就不行。这个捷径涉及到混合积的内容。
以下是向量叉乘的计算方式:
向量 a ⃗ = ( x 1 , y 1 , z 1 ) \vec{a}=( x_1, \ y_1 , \ z_1 ) \qquad a=(x1, y1, z1) 向量 b ⃗ = ( x 2 , y 2 , z 2 ) \vec{b}=( x_2 , \ y_2 , \ z_2 ) b=(x2, y2, z2)
a和b的叉乘公式为:
a
⃗
×
b
⃗
=
∣
i
j
k
x
1
y
1
z
1
x
2
y
2
z
2
∣
=
(
y
1
z
2
−
z
1
y
2
)
i
+
(
z
1
x
2
−
x
1
z
2
)
j
+
(
x
1
y
2
−
y
1
x
2
)
k
=
i
∣
y
1
z
1
y
2
z
2
∣
−
j
∣
x
1
z
1
x
2
z
2
∣
+
k
∣
x
1
y
1
x
2
y
2
∣
\vec{a} \times \vec{b}=\left| \begin{matrix} i & j & k \\ x_1 & y_1 & z_1 \\ x_2 & y_2 & z_2 \end{matrix} \right| =(y_1z_2-z_1y_2)i+(z_1x_2-x_1z_2)j+(x_1y_2-y_1x_2)k=i\left| \begin{matrix} y_1 & z_1 \\ y_2 & z_2 \end{matrix} \right|- j\left| \begin{matrix} x_1 & z_1 \\ x_2 & z_2 \end{matrix} \right|+ k\left| \begin{matrix} x_1 & y_1 \\ x_2 & y_2 \end{matrix} \right|
a×b=∣∣∣∣∣∣ix1x2jy1y2kz1z2∣∣∣∣∣∣=(y1z2−z1y2)i+(z1x2−x1z2)j+(x1y2−y1x2)k=i∣∣∣∣y1y2z1z2∣∣∣∣−j∣∣∣∣x1x2z1z2∣∣∣∣+k∣∣∣∣x1x2y1y2∣∣∣∣
a ⃗ × b ⃗ = ( y 1 z 2 − z 1 y 2 , z 1 x 2 − x 1 z 2 , x 1 y 2 − y 1 x 2 ) \vec{a} \times \vec{b}=(y_1z_2-z_1y_2 \ , \ z_1x_2-x_1z_2 \ , \ x_1y_2-y_1x_2) a×b=(y1z2−z1y2 , z1x2−x1z2 , x1y2−y1x2)