- 边长
- 坐标
- 二维空间
- 三维空间
- 原理
已知三边求面积,最简便的方法就是用海伦公式
海伦公式: 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}neqfrac{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} timesvec{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}absintheta 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=ileft| begin{matrix} y_1 & z_1 \ y_2 & z_2 end{matrix} right|- jleft| begin{matrix} x_1 & z_1 \ x_2 & z_2 end{matrix} right|+ kleft| 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)



