日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

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

一般有兩種算法來(lái)計(jì)算平面上給定n個(gè)點(diǎn)的凸包:Graham掃描法(Graham’s scan),時(shí)間復(fù)雜度為O(nlgn);Jarvis步進(jìn)法(Jarvis march),時(shí)間復(fù)雜度為O(nh),其中h為凸包頂點(diǎn)的個(gè)數(shù)。這兩種算法都按逆時(shí)針?lè)较蜉敵鐾拱旤c(diǎn)。

Graham掃描法

用一個(gè)棧來(lái)解決凸包問(wèn)題,點(diǎn)集Q中每個(gè)點(diǎn)都會(huì)進(jìn)棧一次,不符合條件的點(diǎn)會(huì)被彈出,算法終止時(shí),棧中的點(diǎn)就是凸包的頂點(diǎn)(逆時(shí)針順序在邊界上)。

算法步驟如下圖:

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

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

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

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

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

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

import sysimport mathimport timeimport random#獲取基準(zhǔn)點(diǎn)的下標(biāo),基準(zhǔn)點(diǎn)是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#叉乘計(jì)算方法def multiply(p1, p2, p0): return (p1[0] - p0[0]) * (p2[1] - p0[1]) - (p2[0] - p0[0]) * (p1[1] - p0[1])#獲取極角,通過(guò)求反正切得出,考慮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#對(duì)極角進(jìn)行排序,排序結(jié)果list不包含基準(zhǔn)點(diǎn)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(’全部點(diǎn):’,p) k = get_leftbottompoint(p) pk = p[k] p.remove(p[k]) #print(’排序前去除基準(zhǔn)點(diǎn)的所有點(diǎn):’,p,’基準(zhǔn)點(diǎn):’,pk) p_sort = sort_points_tan(p, pk) #按與基準(zhǔn)點(diǎn)連線和x軸正向的夾角排序后的點(diǎn)坐標(biāo) #print(’其余點(diǎn)與基準(zhǔn)點(diǎn)夾角排序:’,p_sort) p_result = [pk,p_sort[0]] top = 2 for i in range(1, len(p_sort)): ##################################### #叉乘為正,向前遞歸刪點(diǎn);叉乘為負(fù),序列追加新點(diǎn) while(multiply(p_result[-2], p_sort[i],p_result[-1]) > 0): p_result.pop() p_result.append(p_sort[i]) return p_result#測(cè)試

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求凸包及多邊形面積教程

計(jì)算多邊形面積

(1)順時(shí)針給定構(gòu)成凸包的n個(gè)點(diǎn)坐標(biāo),叉乘法求多邊形面積:

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

def GetAreaOfPolyGonbyVector(points): # 基于向量叉乘計(jì)算多邊形面積 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)順時(shí)針給定構(gòu)成凸包的n個(gè)點(diǎn)經(jīng)緯度坐標(biāo),先將經(jīng)緯度坐標(biāo)轉(zhuǎn)化成凸多邊形的邊的經(jīng)緯度距離,利用海倫公式求多邊形面積:

from geopy.distance import vincentyimport mathdef HeronGetAreaOfPolyGonbyVector(points): # 基于海倫公式計(jì)算多邊形面積 area = 0 if(len(points)<3): raise Exception('error') pb=((points[-1][0]+points[0][0])/2,(points[-1][1]+points[0][1])/2) #基準(zhǔn)點(diǎn)選為第一個(gè)點(diǎn)和最后一個(gè)點(diǎn)連線邊上的中點(diǎn) for i in range(0,len(points)-1): p1 = points[i] p2 = points[i + 1] db1 = vincenty(pb,p1).meters #根據(jù)維度轉(zhuǎn)化成經(jīng)緯度距離 d12 = vincenty(p1,p2).meters d2b = vincenty(p2,pb).meters #print(db1,d12,d2b) hc = (db1+d12+d2b)/2 #db1是基準(zhǔn)點(diǎn)和p1的距離,d12是p1和p2的距離,d2b是p2和基準(zhǔn)點(diǎn)距離 #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)基準(zhǔn)點(diǎn)的確認(rèn)原則:

有唯一的某個(gè)點(diǎn)縱坐標(biāo)最小,該點(diǎn)為基準(zhǔn)點(diǎn);

不止一個(gè)點(diǎn)的縱坐標(biāo)最小,選這些點(diǎn)里最靠左的為基準(zhǔn)點(diǎn)

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

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

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

若橫縱坐標(biāo)都相等(兩點(diǎn)相同),返回-1;

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

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

(4)對(duì)極角進(jìn)行排序,排序結(jié)果list不包含基準(zhǔn)點(diǎn):

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]點(diǎn)與基準(zhǔn)點(diǎn)p[k]連線的極角(與x軸正向夾角)#根據(jù)p2的“arc”鍵的值從小到大排序,最后輸出按該角度值排序?qū)?yīng)順序的各個(gè)點(diǎn)

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

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

主要是找角度是否大于180o——差乘正負(fù)——點(diǎn)進(jìn)出棧順序三者關(guān)系

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

...一直遍歷到最后一個(gè)點(diǎn)...一直遍歷到最后一個(gè)點(diǎn)

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

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

以上這篇Python求凸包及多邊形面積教程就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
美女精品视频在线| 国产一区二区三区四区五区传媒| 一本大道色婷婷在线| a天堂资源在线| 欧美亚洲日本精品| 国产资源在线观看入口av| 四虎8848精品成人免费网站 | 久久一区二区三区喷水| 国产精品久久久久av电视剧| 欧美国产三级| 四虎国产精品免费观看| 日本欧美不卡| 欧美福利专区| 日韩影院在线观看| 日本aⅴ精品一区二区三区 | 日韩精品中文字幕一区二区| 亚洲永久精品唐人导航网址| 亚洲aa在线| 国产日韩高清一区二区三区在线| 国产情侣一区| 久久免费影院| 高清av一区二区三区| 91九色精品国产一区二区| 免费在线观看不卡| 国产日韩高清一区二区三区在线 | 成人羞羞在线观看网站| 欧美肉体xxxx裸体137大胆| 国产精品社区| 日韩精品久久理论片| 久久免费影院| 欧美va亚洲va日韩∨a综合色| 久久国产高清| 国产精品美女在线观看直播| 波多野结衣久久精品| 亚洲一区国产| 国产精品白浆| 欧美91福利在线观看| 青青在线精品| 日韩精品欧美| 青青草精品视频| 97在线精品| 免费在线欧美视频| 国产一区二区三区亚洲综合| 另类中文字幕国产精品| 在线看片日韩| 日本久久黄色| 免费在线观看视频一区| 六月丁香综合在线视频| 亚洲精品中文字幕乱码| 久久国产精品色av免费看| 国产自产自拍视频在线观看| 中文字幕一区二区av| 麻豆理论在线观看| 亚洲aⅴ网站| 日韩中文在线电影| 日韩一区二区三区在线看| 日韩精品专区| 奇米亚洲欧美| 久久久噜噜噜| 啪啪亚洲精品| 亚洲h色精品| 国产日韩欧美一区二区三区| 一区二区三区视频免费观看| 欧美三级第一页| 亚洲精品网址| 91一区二区三区四区| 日韩国产精品久久久久久亚洲| 午夜av不卡| 国产精品videosex极品| 99视频精品| 成人台湾亚洲精品一区二区| 视频一区中文字幕精品| 丰满少妇一区| 日韩国产高清在线| 蜜桃视频欧美| 国产91欧美| 日韩精品一级| 中文在线不卡| 欧美成人基地| 精品免费av| 日本va欧美va瓶| 国产精品97| 日韩欧美二区| 久久精品国产久精国产| 亚洲精品乱码久久久久久蜜桃麻豆 | 国产精品成人自拍| 美女91精品| 欧美午夜精彩| 欧美男人天堂| 精品日韩一区| 国产精品尤物| 亚洲bt欧美bt精品777| 伊人精品视频| 999久久久免费精品国产| 国产一区二区三区免费在线| 欧美亚洲福利| 亚洲精品看片| 久久午夜精品| 伊人成人在线视频| 亚洲手机在线| 麻豆mv在线观看| 高清av一区| 久久午夜影院| 国产极品一区| 国产乱论精品| 国产亚洲一卡2卡3卡4卡新区| 在线观看亚洲精品福利片| 欧美日韩三区| 狠狠色综合网| 黄色成人在线网址| 一区二区三区四区在线看| 亚洲午夜天堂| 日韩欧美一区免费| 日韩欧美一区二区三区在线观看| 伊伊综合在线| 欧美日韩在线观看首页| 国产白浆在线免费观看| 国产va免费精品观看精品视频| 国产黄色一区| 久久亚洲精精品中文字幕| 另类欧美日韩国产在线| 国产精品久久久久久模特| 国产精品久久久一区二区| 久久99精品久久久野外观看| 美女精品久久| 国产一区三区在线播放| 亚洲欧洲美洲av| 色综合www| 黄色在线一区| 蜜桃视频免费观看一区| 亚洲尤物av| 日本a级不卡| 国产私拍福利精品视频二区| 国产精品视频3p| 美女高潮久久久| 狠狠躁少妇一区二区三区| 色婷婷久久久| 亚洲深夜影院| 奇米色欧美一区二区三区| 国产精品美女在线观看直播| 麻豆精品av| 色综合www| 美女尤物久久精品| 日韩和欧美的一区| 美女精品久久| 日韩欧美二区| 午夜国产精品视频免费体验区| 奶水喷射视频一区| 欧美日本二区| 久久在线91| 香蕉久久精品| 日韩三级久久| 国产中文欧美日韩在线| 欧美1区2区3区| 日韩欧美高清一区二区三区| 九九九精品视频| 欧美日韩一二三四| 日韩一区中文| 国产盗摄——sm在线视频| 蜜桃视频欧美| 亚洲欧洲美洲国产香蕉| 国产精品欧美日韩一区| 91中文字幕精品永久在线| 悠悠资源网久久精品| 日韩精品1区2区3区| 国产传媒在线观看| 三级欧美在线一区| 老司机精品视频在线播放| 蜜桃一区二区三区| 欧美视频精品全部免费观看| 日韩在线短视频| 免费视频一区二区| 免费亚洲婷婷| 99综合视频| 欧美激情在线精品一区二区三区| 国产不卡人人| 亚洲永久精品唐人导航网址| 日韩成人精品一区| 视频一区视频二区中文字幕| 国产精品a级| 最新亚洲一区| 国产精品大片| 亚洲制服少妇| 精品国产aⅴ| 性色一区二区| 精品午夜久久| 蜜臀a∨国产成人精品| 国产成人77亚洲精品www| 亚洲一区导航| 精品亚洲美女网站| 日本午夜精品一区二区三区电影| 免费高潮视频95在线观看网站| 综合亚洲视频| 国产白浆在线免费观看| 午夜电影一区| 欧美成人日韩| 国产精品精品国产一区二区| 亚洲欧美在线综合| 久久伦理在线| 精品一区二区三区视频在线播放 |