python求三角形面积

这篇博客介绍了如何使用Python计算二维和三维空间中三角形的面积。对于二维空间,可以通过海伦公式或向量叉乘计算;在三维空间,同样利用向量叉乘求解。文章提供了详细的代码示例,包括计算三边长度和向量叉乘的方法。
摘要由CSDN通过智能技术生成

边长

已知三边求面积,最简便的方法就是用海伦公式

海伦公式: 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(pa)(pb)(pc) 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} SABC计算如下:
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| SABC=21x1x2x3y1y2y3111=21x2x1x3x1y2y1y3y1

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}| SABC=21x1x2x3y1y2y3z1z2z3SABC=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θSABC=21a 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| SABC=21x1x2x3y1y2y3111,最后结果取绝对值。但空间坐标就不行。这个捷径涉及到混合积的内容。


以下是向量叉乘的计算方式:

向量 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=(y1z2z1y2)i+(z1x2x1z2)j+(x1y2y1x2)k=iy1y2z1z2jx1x2z1z2+kx1x2y1y2

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 =(y1z2z1y2 , z1x2x1z2 , x1y2y1x2)

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值