求三角形 四边形面积(python)

注:对于四边形,需要先按顺时针或者逆时针排序,可以对凸四边形或者凹四边形进行计算。


#!/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,不如为我打款!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值