栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python求三角形面积

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python求三角形面积

python求三角形面积
  • 边长
  • 坐标
    • 二维空间
    • 三维空间
    • 原理

边长

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

海伦公式: 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​∣∣∣∣∣∣​x1​x2​x3​​y1​y2​y3​​111​∣∣∣∣∣∣​=21​∣∣∣∣​x2​−x1​x3​−x1​​y2​−y1​y3​−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​∣∣∣∣∣∣​x1​x2​x3​​y1​y2​y3​​z1​z2​z3​​∣∣∣∣∣∣​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=21​absinθ。求余弦值的时候无论用哪种方法,都没海伦公式简单。

向量的叉乘: 先了解一下, 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​∣∣∣∣∣∣​x1​x2​x3​​y1​y2​y3​​111​∣∣∣∣∣∣​,最后结果取绝对值。但空间坐标就不行。这个捷径涉及到混合积的内容。


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

向量 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 =∣∣∣∣∣∣​ix1​x2​​jy1​y2​​kz1​z2​​∣∣∣∣∣∣​=(y1​z2​−z1​y2​)i+(z1​x2​−x1​z2​)j+(x1​y2​−y1​x2​)k=i∣∣∣∣​y1​y2​​z1​z2​​∣∣∣∣​−j∣∣∣∣​x1​x2​​z1​z2​​∣∣∣∣​+k∣∣∣∣​x1​x2​​y1​y2​​∣∣∣∣​

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 =(y1​z2​−z1​y2​ , z1​x2​−x1​z2​ , x1​y2​−y1​x2​)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/280733.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号