平面中任意给出几个坐标求多边形面积(python)

一、方法一(把四边形分成两个三角形)

假设在平面内,有一个三角形,边长分别为a、b、c,三角形的面积S可由以下公式求得:

而公式里的p为半周长(周长的一半):

import numpy as np        #导入所需要的包
import math
def myarea(x1,x2,x3,x4):
    a = x1-x2
    d1 = math.hypot(a[0],a[1])  #用math.hypot()函数求距离     
    b =  x2-x3
    d2 = math.hypot(b[0],b[1])
    c = x3-x4
    d3 = math.hypot(c[0],c[1])
    d = x1-x4
    d4 = math.hypot(d[0],d[1])
    e = x1-x3
    d5 = math.hypot(e[0],e[1])
    print(d1,d2,d3,d4,d5)        #输出各边的长度
    k1 = (d1+d4+d5)/2 
    k2 = (d2+d3+d5)/2 
    s1 = (k1*(k1-d1)*(k1-d4)*(k1-d5))**0.5 
    s2 = (k2*(k2-d2)*(k2-d3)*(k2-d5))**0.5 
    s = s1+s2 
    return s
x1 = np.array([1.0,1.0])
x2 = np.array([6.0,1.0])
x3 = np.array([6.0,6.0])
x4 = np.array([1.0,6.0])
a = myarea(x1,x2,x3,x4)
print(a)

#输出结果
5.0 5.0 5.0 5.0 7.0710678118654755
Out[1]:
25.0

二、结合opencv求任意多边形面积

直接上代码说明

import cv2
import numpy as np
 
image = cv2.imread('img0.jpg')  # (这里读入的图的尺寸要大于你的多边形)
polygon = np.array([[[2, 2], [6, 2], [6, 6], [2, 6]]], dtype=np.int32)  # 这里是多边形的顶点坐标
im = np.zeros(image.shape[:2], dtype="uint8")  # 获取图像的维度: (h,w)=iamge.shape[:2]
polygon_mask = cv2.fillPoly(im, polygon, 255)
 
area = np.sum(np.greater(polygon_mask, 0))
print (area)

#输出结果25

两种方法的结果是相同的,相比而言,第一种方法较复杂,因为当多边形的边越多,分割的三角形就越多。而第二种方法就不需要考虑那么多,直接输入坐标就可以了。

你可能感兴趣的:(平面中任意给出几个坐标求多边形面积(python))