需要用Python實(shí)現(xiàn)一個(gè)算法,求解三維空間中兩條軌跡所圍成的面積,具體如下:
如上所示,兩條軌跡由點(diǎn)序列組成(紅色和黑色軌跡),三維坐標(biāo)可表示為(x,y,t),目的就是要求這兩條軌跡之間所圍成的面積。現(xiàn)在的思路是將求兩條軌跡之間圍城的面積轉(zhuǎn)換為分別求兩條軌跡點(diǎn)構(gòu)成三角形的面積,然后利用海倫公式進(jìn)行面積求解,具體如下:
但是這樣做有一個(gè)問題,就是兩條軌跡的點(diǎn)序列如何構(gòu)成三角形,在此想問問大家有沒有什么好的方法,或者好的建議,謝謝!(注意:兩條軌跡的點(diǎn)序列個(gè)數(shù)可能是不一樣的,即一條軌跡可能只有3個(gè)點(diǎn),而另一條軌跡有5個(gè)點(diǎn))
兩點(diǎn):三角形是a, b輪流的;軌跡序列可能不等長。
def find_triangle(a, b):
# 比較軌跡序列長短并交換,方便取起始點(diǎn)
la, lb = len(a), len(b)
if la > lb:
a, b = b, a
la, lb = lb, la
# 三角形構(gòu)造,a,b輪流
triangles = []
for i in range(la - 1):
triangles.append((b[i], a[i], b[i + 1]))
triangles.append((a[i], b[i + 1], a[i + 1]))
# 長序列軌跡其他點(diǎn)的三角形構(gòu)造
more = b[la - 1:]
for j in range(len(more) - 1):
triangles.append((more[j], a[la - 1], more[j + 1]))
return triangles
>>> S1 = ['a1', 'a2', 'a3']
>>> S2 = ['b1', 'b2', 'b3', 'b4', 'b5']
>>> print(find_triangle(S1, S2))
[('b1', 'a1', 'b2'), ('a1', 'b2', 'a2'), ('b2', 'a2', 'b3'), ('a2', 'b3', 'a3'), ('b3', 'a3', 'b4'), ('b4', 'a3', 'b5')]
>>> print(find_triangle(S2, S1))
[('b1', 'a1', 'b2'), ('a1', 'b2', 'a2'), ('b2', 'a2', 'b3'), ('a2', 'b3', 'a3'), ('b3', 'a3', 'b4'), ('b4', 'a3', 'b5')]總面積=所有黑底三角形面積+所有紅底三角形面積
重點(diǎn)是湊三角形的三個(gè)點(diǎn)
黑色點(diǎn)編號(hào)為b0~b4
紅色點(diǎn)編號(hào)為r0~r4
黑底三角形三點(diǎn)為 b0 b1 r0,... b3 b4 r3
紅底三角形三點(diǎn)為 r0 r1 r1,... r3 r4 r4
點(diǎn)湊出來了 其他的再繼續(xù)想辦法吧
部分代碼可以寫成這樣
class Point:
__slots__=('x','y','z')
def __init__(self,x,y,z):
self.x,self.y,self.z=x,y,z
red_point,black_point=list(range(4)),list(range(4))
blacktria=[(i,i+1,j) for i,j in zip(black_point[:4],red_point[:4])]
redtria=[(j,j+1,i+1) for i,j in zip(black_point[:4],red_point[:4])]
print(blacktria,'n',redtria)
blacktria與redtria的內(nèi)容如下:
[(0, 1, 0), (1, 2, 1), (2, 3, 2), (3, 4, 3)]
[(0, 1, 1), (1, 2, 2), (2, 3, 3), (3, 4, 4)]
我看了一下,你這個(gè)三角形構(gòu)造是有個(gè)規(guī)律性的,我用一個(gè)偽代碼表示一下兩條軌跡,設(shè)每個(gè)點(diǎn)的坐標(biāo)為:
dot_nt = (x,y,z) # n代表第幾條運(yùn)動(dòng)軌跡,n in (1,2);t代表第幾個(gè)點(diǎn)n in [0,n]
那么對(duì)于軌跡1可以形成:
[dot_10,dot_11,dot_12,...]
對(duì)于軌跡2可以形成:
[dot_20,dot_21,dot_22,...]
然后的話,可以看到一個(gè)
[dot_10,dot_20,dot_11],[dot_11,dot_21,dot_12],[dot_12,dot_22,dot_13],...
這樣的一個(gè)有規(guī)律的數(shù)據(jù),然后根據(jù)這個(gè)規(guī)律就可以用程序圍成一個(gè)三角形了,如果你覺得思路對(duì)的話可以嘗試去實(shí)現(xiàn),我感覺應(yīng)該就是這個(gè)樣子了
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺(tái)、一站式人才輸送平臺(tái)。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級(jí)產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動(dòng)互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺(tái)面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對(duì)瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。