计算polygon面积和判断顺逆时针方向的方法
生活随笔
收集整理的這篇文章主要介紹了
计算polygon面积和判断顺逆时针方向的方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一.利用shapely求polygon面積
import shapelyfrom shapely.geometry import Polygon, MultiPoint # 多邊形# box1 = [2, 0, 4, 2, 2, 4, 0, 2, 0, 0]box1 = [2, 0, 4, 2, 2, 4, 0, 2, 2, 2]poly_box1 = Polygon(np.array(box1).reshape(-1,2))print(poly_box1)print(poly_box1.area)二.逆時針調整為順時針
1.四個點?
def polygon_area1():'''compute area of a polygon:param poly::return:'''# # #順時針# poly = np.array([[2, 0],# [4, 2],# [2, 4],# [0, 2]])# 逆時針poly = np.array([[2, 0],[0, 2],[2, 4],[4, 2]])poly_h = poly.shape[0]edge = []for i in range(poly_h - 1):edge.append((poly[i][0] - poly[i+1][0])*(poly[i][1] + poly[i + 1][1]))edge.append((poly[poly_h-1][0] - poly[0][0])*(poly[poly_h-1][1]+poly[0][1]))# edge = [# (poly[1][0] - poly[0][0]) * (poly[1][1] + poly[0][1]),# (poly[2][0] - poly[1][0]) * (poly[2][1] + poly[1][1]),# (poly[3][0] - poly[2][0]) * (poly[3][1] + poly[2][1]),# (poly[0][0] - poly[3][0]) * (poly[0][1] + poly[3][1])# ]area = np.sum(edge) / 2.print('=====The first way======')print('area:', area)if area <0:index = [0] + [i for i in range(poly_h - 1, 0, -1)]fix_poly = poly[index, :]print('fix_poly:', fix_poly) def polygon_area2():'''compute area of a polygon:param poly::return:'''# # #順時針# poly = np.array([[2, 0],# [4, 2],# [2, 4],# [0, 2]])# 逆時針poly = np.array([[2, 0],[0, 2],[2, 4],[4, 2]])edge = []poly_h = poly.shape[0]for i in range(poly_h-1):edge.append(poly[i][0] * poly[i+1][1] - poly[i+1][0] * poly[i][1])edge.append(poly[poly_h-1][0] * poly[0][1] - poly[0][0] * poly[poly_h-1][1])print('=====The second way======')# print('edge:', edge)area = np.sum(edge)/2.print('area:', area)#如果是逆時針 調整為順時針if area < 0:index = [0] + [i for i in range(poly_h-1, 0, -1)]# print(index)fix_poly = poly[index, :]print('fix_poly:', fix_poly) if __name__ == '__main__':# show_image()# compute_IOU_()polygon_area1()polygon_area2()2.多個點
def polygon_area1():'''compute area of a polygon:param poly::return:'''# # #順時針# poly = np.array([[2, 0],# [4, 2],# [2, 4],# [0, 2]])# 逆時針 凹多邊形print('凹多邊形')poly = np.array([[2, 0],[2, 2],[0, 2],[2, 4],[4, 2]])# 逆時針 凸多邊形# print('凸多邊形')# poly = np.array([[2, 0],# [0, 0],# [0, 2],# [2, 4],# [4, 2]])poly_h = poly.shape[0]edge = []for i in range(poly_h - 1):edge.append((poly[i][0] - poly[i+1][0])*(poly[i][1] + poly[i + 1][1]))edge.append((poly[poly_h-1][0] - poly[0][0])*(poly[poly_h-1][1]+poly[0][1]))# edge = [# (poly[1][0] - poly[0][0]) * (poly[1][1] + poly[0][1]),# (poly[2][0] - poly[1][0]) * (poly[2][1] + poly[1][1]),# (poly[3][0] - poly[2][0]) * (poly[3][1] + poly[2][1]),# (poly[0][0] - poly[3][0]) * (poly[0][1] + poly[3][1])# ]area = np.sum(edge) / 2.print('=====The first way======')print('area:', area)if area <0:print('此為逆時針,調整為順時針')index = [0] + [i for i in range(poly_h - 1, 0, -1)]fix_poly = poly[index, :]print('fix_poly:', fix_poly) def polygon_area2():'''compute area of a polygon:param poly::return:'''# # #順時針# poly = np.array([[2, 0],# [4, 2],# [2, 4],# [0, 2]])# 逆時針 凹多邊形print('凹多邊形')poly = np.array([[2, 0],[2, 2],[0, 2],[2, 4],[4, 2]])# 逆時針 凸多邊形# print('凸多邊形')# poly = np.array([[2, 0],# [0, 0],# [0, 2],# [2, 4],# [4, 2]])edge = []poly_h = poly.shape[0]for i in range(poly_h-1):edge.append(poly[i][0] * poly[i+1][1] - poly[i+1][0] * poly[i][1])edge.append(poly[poly_h-1][0] * poly[0][1] - poly[0][0] * poly[poly_h-1][1])print('=====The second way======')# print('edge:', edge)area = np.sum(edge)/2.print('area:', area)#如果是逆時針 調整為順時針if area < 0:print('此為逆時針,調整為順時針')index = [0] + [i for i in range(poly_h-1, 0, -1)]# print(index)fix_poly = poly[index, :]print('fix_poly:', fix_poly) if __name__ == '__main__':# show_image()# compute_IOU_()polygon_area1()polygon_area2()
三.計算不規則多邊形面積
分解成梯形,面積依次相加
import numpy as np points = np.array([[0.72, 2.28],[2.66, 4.71],[5, 3.5],[3.63, 2.52],[4, 1.6],[1.9, 1]]) print(points.shape) h, w = points.shape areas = [] for i in range(0, points.shape[0]):area = (points[(i+1) % h][-1] + points[i][-1])*(points[(i+1) % h][0] - points[i][0])/2areas.append(area)print(points[i])print(points[(i+1) % h]) print('==areas:', areas) print(sum(areas))?
參考:https://www.cnblogs.com/TenosDoIt/p/4047211.html
?
總結
以上是生活随笔為你收集整理的计算polygon面积和判断顺逆时针方向的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaSE——面向对象高级(继承、fi
- 下一篇: 训练数据的分布对F-measure, r