电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Python求凸包及多邊形面積教程

瀏覽:4日期:2022-07-30 11:04:02

一般有兩種算法來計算平面上給定n個點的凸包:Graham掃描法(Graham’s scan),時間復雜度為O(nlgn);Jarvis步進法(Jarvis march),時間復雜度為O(nh),其中h為凸包頂點的個數。這兩種算法都按逆時針方向輸出凸包頂點。

Graham掃描法

用一個棧來解決凸包問題,點集Q中每個點都會進棧一次,不符合條件的點會被彈出,算法終止時,棧中的點就是凸包的頂點(逆時針順序在邊界上)。

算法步驟如下圖:

Python求凸包及多邊形面積教程

Python求凸包及多邊形面積教程

Python求凸包及多邊形面積教程

Python求凸包及多邊形面積教程

Python求凸包及多邊形面積教程

Python求凸包及多邊形面積教程

import sysimport mathimport timeimport random#獲取基準點的下標,基準點是p[k]def get_leftbottompoint(p): k = 0 for i in range(1, len(p)): if p[i][1] < p[k][1] or (p[i][1] == p[k][1] and p[i][0] < p[k][0]): k = i return k#叉乘計算方法def multiply(p1, p2, p0): return (p1[0] - p0[0]) * (p2[1] - p0[1]) - (p2[0] - p0[0]) * (p1[1] - p0[1])#獲取極角,通過求反正切得出,考慮pi/2的情況def get_arc(p1, p0): # 兼容sort_points_tan的考慮 if (p1[0] - p0[0]) == 0: if ((p1[1] - p0[1])) == 0: return -1; else: return math.pi / 2 tan = float((p1[1] - p0[1])) / float((p1[0] - p0[0])) arc = math.atan(tan) if arc >= 0: return arc else: return math.pi + arc#對極角進行排序,排序結果list不包含基準點def sort_points_tan(p, pk): p2 = [] for i in range(0, len(p)): p2.append({'index': i, 'arc': get_arc(p[i], pk)}) #print(’排序前:’,p2) p2.sort(key=lambda k: (k.get(’arc’))) #print(’排序后:’,p2) p_out = [] for i in range(0, len(p2)): p_out.append(p[p2[i]['index']]) return p_outdef convex_hull(p): p=list(set(p)) #print(’全部點:’,p) k = get_leftbottompoint(p) pk = p[k] p.remove(p[k]) #print(’排序前去除基準點的所有點:’,p,’基準點:’,pk) p_sort = sort_points_tan(p, pk) #按與基準點連線和x軸正向的夾角排序后的點坐標 #print(’其余點與基準點夾角排序:’,p_sort) p_result = [pk,p_sort[0]] top = 2 for i in range(1, len(p_sort)): ##################################### #叉乘為正,向前遞歸刪點;叉乘為負,序列追加新點 while(multiply(p_result[-2], p_sort[i],p_result[-1]) > 0): p_result.pop() p_result.append(p_sort[i]) return p_result#測試

if __name__ == ’__main__’: pass test_data = [(220, -100), (0,0), (-40, -170), (240, 50), (-160, 150), (-210, -150)] print(test_data) result = convex_hull(test_data) print(result) t=0import matplotlib.pyplot as pltx1=[]y1=[]for i in range(len(test_data)): ri=test_data[i] #print(ri) x1.append(ri[0]) y1.append(ri[1])plt.plot(x1,y1,linestyle=’ ’,marker=’.’)xx=[]yy=[]for i in range(len(result)): ri=result[i] #print(ri) xx.append(ri[0]) yy.append(ri[1])plt.plot(xx,yy,linestyle=’ ’,marker=’*’)

Python求凸包及多邊形面積教程

計算多邊形面積

(1)順時針給定構成凸包的n個點坐標,叉乘法求多邊形面積:

Python求凸包及多邊形面積教程

def GetAreaOfPolyGonbyVector(points): # 基于向量叉乘計算多邊形面積 area = 0 if(len(points)<3): raise Exception('error') for i in range(0,len(points)-1): p1 = points[i] p2 = points[i + 1] triArea = (p1[0]*p2[1] - p2[0]*p1[1])/2 #print(triArea) area += triArea fn=(points[-1][0]*points[0][1]-points[0][0]*points[-1][1])/2 #print(fn) return abs(area+fn)points = []x = [1,3,2]y = [1,2,2] #[(1,1),(3,1),(5,3),(3,5),(1,3)] # x=[1,3,5,3,1]# y=[1,1,3,5,3]for index in range(len(x)): points.append((x[index],y[index]))area = GetAreaOfPolyGonbyVector(points)print(area)#print(math.ceil(area))

(2)順時針給定構成凸包的n個點經緯度坐標,先將經緯度坐標轉化成凸多邊形的邊的經緯度距離,利用海倫公式求多邊形面積:

from geopy.distance import vincentyimport mathdef HeronGetAreaOfPolyGonbyVector(points): # 基于海倫公式計算多邊形面積 area = 0 if(len(points)<3): raise Exception('error') pb=((points[-1][0]+points[0][0])/2,(points[-1][1]+points[0][1])/2) #基準點選為第一個點和最后一個點連線邊上的中點 for i in range(0,len(points)-1): p1 = points[i] p2 = points[i + 1] db1 = vincenty(pb,p1).meters #根據維度轉化成經緯度距離 d12 = vincenty(p1,p2).meters d2b = vincenty(p2,pb).meters #print(db1,d12,d2b) hc = (db1+d12+d2b)/2 #db1是基準點和p1的距離,d12是p1和p2的距離,d2b是p2和基準點距離 #print(hc, hc-db1, hc-d12, hc-d2b) triArea = math.sqrt(hc*(hc-db1)*(hc-d12)*(hc-d2b)) #print(triArea) area += triArea return areapoints = []x = [1,3,2]y = [1,2,2] #[(1,1),(3,1),(5,3),(3,5),(1,3)] # x=[1,3,5,3,1]# y=[1,1,3,5,3]for index in range(len(x)): points.append((x[index],y[index]))area = HeronGetAreaOfPolyGonbyVector(points)print(area)#print(math.ceil(area))

Graham程序原理

(1)基準點的確認原則:

有唯一的某個點縱坐標最小,該點為基準點;

不止一個點的縱坐標最小,選這些點里最靠左的為基準點

(2)計算叉乘【后續利用叉乘正負判斷夾角是否大于180o】:

Python求凸包及多邊形面積教程

(3)獲取極角,通過求反正切得出:

若橫縱坐標都相等(兩點相同),返回-1;

若橫坐標相等/縱坐標不相等(兩點連線垂直y軸),返回 Python求凸包及多邊形面積教程

Python求凸包及多邊形面積教程

(4)對極角進行排序,排序結果list不包含基準點:

p2=[{'index':0, 'arc':get_arc(p[0],p[k])}, {'index':1, 'arc':get_arc(p[1],p[k])}, ··· {'index':k-1, 'arc':get_arc(p[k-1],p[k])}, {'index':k+1, 'arc':get_arc(p[k+1],p[k])}, ··· {'index':n, 'arc':get_arc(p[n],p[k])}]#get_arc(p[0],p[k])即獲得p[0]點與基準點p[k]連線的極角(與x軸正向夾角)#根據p2的“arc”鍵的值從小到大排序,最后輸出按該角度值排序對應順序的各個點

(5)逆時針確定凸多邊形:

Python求凸包及多邊形面積教程

主要是找角度是否大于180o——差乘正負——點進出棧順序三者關系

Python求凸包及多邊形面積教程

...一直遍歷到最后一個點...一直遍歷到最后一個點

規律:叉乘>0,夾角小于180o,遞歸向前刪點;叉乘<0,夾角大于180o,不刪點,加入新點,向后遍歷叉乘>0,夾角小于180o,遞歸向前刪點;叉乘<0,夾角大于180o,不刪點,加入新點,向后遍歷

注意:(a)上述給非基準點按極角從到大小排號時,有兩個及以上點“和基準點連線構成的極角”相等時,這些點的排號挨著但是沒有固定順序,這點并不影響算法給出凸包的準確性。(b)對排號最后的一個點,掃描算法里沒有任何刪除該點的機制,但是這點也不影響算法給出凸包的準確性。(c)上述程序需要額外加入,判斷結束棧內點數小于3和篩選凸包前點數小于3,不能計算多邊形面積的情況,可以直接給這種情況賦值0返回。

以上這篇Python求凸包及多邊形面積教程就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Python 編程
相關文章:
主站蜘蛛池模板: 免费B2B信息推广发布平台 - 推发网 | 流量卡中心-流量卡套餐查询系统_移动电信联通流量卡套餐大全 | 江苏农村商业银行招聘网_2024江苏农商行考试指南_江苏农商行校园招聘 | 长沙广告公司|长沙广告制作设计|长沙led灯箱招牌制作找望城湖南锦蓝广告装饰工程有限公司 | 济南展厅设计施工_数字化展厅策划设计施工公司_山东锐尚文化传播有限公司 | 珠海白蚁防治_珠海灭鼠_珠海杀虫灭鼠_珠海灭蟑螂_珠海酒店消杀_珠海工厂杀虫灭鼠_立净虫控防治服务有限公司 | 心得体会网_心得体会格式范文模板 | 过跨车_过跨电瓶车_过跨转运车_横移电动平车_厂区转运车_无轨转运车 | NM-02立式吸污机_ZHCS-02软轴刷_二合一吸刷软轴刷-厦门地坤科技有限公司 | 塑料脸盆批发,塑料盆生产厂家,临沂塑料广告盆,临沂家用塑料盆-临沂市永顺塑业 | 工业铝型材-铝合金电机壳-铝排-气动执行器-山东永恒能源集团有限公司 | 领先的大模型技术与应用公司-中关村科金 | 智能型高压核相仪-自动开口闪点测试仪-QJ41A电雷管测试仪|上海妙定 | 压滤机滤板_厢式_隔膜_板框压滤机滤板厂家价格型号材质-大凯环保 | 掺铥光纤放大器-C/L波段光纤放大器-小信号光纤放大器-合肥脉锐光电技术有限公司 | 深圳市源和塑胶电子有限公司-首页| 东亚液氮罐-液氮生物容器-乐山市东亚机电工贸有限公司 | 整车VOC采样环境舱-甲醛VOC预处理舱-多舱法VOC检测环境仓-上海科绿特科技仪器有限公司 | 宁波普瑞思邻苯二甲酸盐检测仪,ROHS2.0检测设备,ROHS2.0测试仪厂家 | 重庆磨床过滤机,重庆纸带过滤机,机床伸缩钣金,重庆机床钣金护罩-重庆达鸿兴精密机械制造有限公司 | 民用音响-拉杆音响-家用音响-ktv专用音响-万昌科技 | 杭州ROHS检测仪-XRF测试仪价格-百科| 郑州宣传片拍摄-TVC广告片拍摄-微电影短视频制作-河南优柿文化传媒有限公司 | 清水-铝合金-建筑模板厂家-木模板价格-铝模板生产「五棵松」品牌 | 冷凝水循环试验箱-冷凝水试验箱-可编程高低温试验箱厂家-上海巨为(www.juweigroup.com) | Honsberg流量计-Greisinger真空表-气压计-上海欧臻机电设备有限公司 | 污泥烘干机-低温干化机-工业污泥烘干设备厂家-焦作市真节能环保设备科技有限公司 | 农产品溯源系统_农产品质量安全追溯系统_溯源系统 | 浙江美尔凯特智能厨卫股份有限公司| 车充外壳,车载充电器外壳,车载点烟器外壳,点烟器连接头,旅行充充电器外壳,手机充电器外壳,深圳市华科达塑胶五金有限公司 | 今日热点_实时热点_奇闻异事_趣闻趣事_灵异事件 - 奇闻事件 | 煤机配件厂家_刮板机配件_链轮轴组_河南双志机械设备有限公司 | 北京银联移动POS机办理_收银POS机_智能pos机_刷卡机_收银系统_个人POS机-谷骐科技【官网】 | CE认证_FCC认证_CCC认证_MFI认证_UN38.3认证-微测检测 CNAS实验室 | 手持式3d激光扫描仪-便携式三维立体扫描仪-北京福禄克斯 | 实验室装修_实验室设计_实验室规划设计- 上海广建净化工程公司 | 塑料熔指仪-塑料熔融指数仪-熔体流动速率试验机-广东宏拓仪器科技有限公司 | 净化车间装修_合肥厂房无尘室设计_合肥工厂洁净工程装修公司-安徽盛世和居装饰 | 层流手术室净化装修-检验科ICU改造施工-华锐净化工程-特殊科室建设厂家 | 滁州高低温冲击试验箱厂家_安徽高低温试验箱价格|安徽希尔伯特 | 水性绝缘漆_凡立水_绝缘漆树脂_环保绝缘漆-深圳维特利环保材料有限公司 |