注:对于四边形,需要先按顺时针或者逆时针排序,可以对凸四边形或者凹四边形进行计算。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@Time : 2021/8/10 9:16
@Author : Allen Pen(Haijun Peng)
@E-mail : shengyutou@outlook.com
@FileName : get_quadrilateral_area.py
@Software : PyCharm
NOTE:
"""
import math
def get_triangle_area(point_a, point_b, point_c):
"""
求三角形面积;
一切都是基于三角形!!!!
原文链接:https: // blog.csdn.net / hjq376247328 / article / details / 49465137
:param point_a、point_b、point_c: 数据类型为list,二维坐标形式[x、y]或三维坐标形式[x、y、z]
:return: 三角形面积,返回 - 1 为不能组成三角形;
"""
area = -1
side = [0,0,0] # 储存三条边的长度;
a_x, b_x, c_x = point_a[0], point_b[0], point_c[0]
a_y, b_y, c_y = point_a[1], point_b[1], point_c[1]
if len(point_a) == len(point_b) == len(point_c) == 3:
# print("坐标点为3维坐标形式")
a_z, b_z, c_z = point_a[2], point_b[2], point_c[2]
else:
a_z, b_z, c_z = 0,0,0
# print("坐标点为2维坐标形式,z 坐标默认值设为0")
side_ab = math.sqrt(pow(a_x - b_x, 2) + pow(a_y - b_y, 2) + pow(a_z - b_z, 2))
side_ac = math.sqrt(pow(a_x - c_x, 2) + pow(a_y - c_y, 2) + pow(a_z - c_z, 2))
side_cb = math.sqrt(pow(c_x - b_x, 2) + pow(c_y - b_y, 2) + pow(c_z - b_z, 2))
# 不能构成三角形;
if side_ab + side_ac <= side_cb or side_ab + side_cb <= side_ac or side_ac + side_cb <= side_ab:
return area
# 利用海伦公式。s = sqr(p * (p - a)(p - b)(p - c));
p = (side_ab + side_ac + side_cb) / 2 # 半周长
area = math.sqrt(p * (p - side_ab) * (p - side_ac) * (p - side_cb))
return area
a = [0,0,9]
b = [0,1,9]
c = [1,1,9]
area = get_triangle_area(a,b,c)
def get_quadrilateral_area(point_a, point_b, point_c, point_d):
"""
本算法可以计算凸四边形,也可以计算凹四边形
本算法用于计算已经按顺时针或者逆时针排序过的点
四边形可以分解为两个三角形
:param point_a, point_b, point_c, point_d: 数据类型为list,二维坐标形式[x、y]或三维坐标形式[x、y、z]
:return: 四边形面积
"""
# 对于凸四边形,以任一点分割成两个三角形均可
# 1,以ac线分割
area_11 = get_triangle_area(point_a, point_b, point_c)
area_12 = get_triangle_area(point_a, point_d, point_c)
area_1 = area_11 + area_12
# 2,以bd线分割
area_21 = get_triangle_area(point_b, point_a, point_d)
area_22 = get_triangle_area(point_b, point_c, point_d)
area_2 = area_21 + area_22
# 对于凸四边形,以任一点分割成两个三角形均可;对于凹四边形,取分割面积小的一种算法为实际面积
area = min(area_1,area_2)
return area
# for area test1
# Area of shell faces (one side only): 512.50
# Coordinates of vertex 1 :0.,0.,0.
# Coordinates of vertex 2 :30.,0.,0.
# Coordinates of vertex 3 :40.,15.,0.
# Coordinates of vertex 0 :15.,20.,0.
# a= [0.,0.,0]
# b= [30.,0.,0]
# c= [40.,15.,0]
# d= [15.,20.,0]
#
# aa = get_quadrilateral_area(a,b,c,d)
# Out[25]: 512.5
# for area test2
# Area 350.00
# Coordinates of vertex 2 :-20.,0.,0.
# Coordinates of vertex 3 :0.,10.,0.
# Coordinates of vertex 0 :15.,0.,0.
# Coordinates of vertex 1 :0.,30.,0.
# a= [-20.,0.,0.]
# b= [0.,10.,0.]
# c= [15.,0.,0.]
# d= [0.,30.,0.]
#
# get_quadrilateral_area(a,b,c,d)
# Out[23]: 349.9999999999997
最后的最后
欢迎大家点赞、评论及转载,转载请注明出处!
如果觉得我帮助到了你:
为我打call,不如为我打款!