2016-02-26 40 views
0

我在編程方面追加兩個列表時遇到一些問題。我想找到是否點的名單是在邊緣或內部的多邊形鋪(他們不能躺在之外)。什麼我有是:以編程方式在python中追加列表

  1. 「pedges」是邊形成一個封閉的列表在Abaqus的多邊形

  2. 「區域」是列表「花車」

  3. 有一個內置的函數調用getDistance我肯定效果不錯(從Abaqus的)

    a)如點奠定了邊緣,然後在這個位置的區域N添加至areas_onEdge=[]

    b)若一個點上不邊緣然後在該位置的區域被添加到areas_inside=[]

  4. 鋪設最後我計算sum(areas_inside)/areaShell

我試圖一些直接的代碼,但它不起作用。

我做錯了什麼?

areaShell=368.97; 
areas_onEdge=[] 
areas_inside=[] 

points=[(923.9,562.0244,0),(923.9,570.8333,0),(914.1,568.6853,0),(923.9,554.1,0),(928.8,568.6853,0),(919,579.2,0)] 
areas=[787.2464,368.97,73984.02,42012.99,73984.02,44627.33] 
print 'points Inter '.join(map(str,points)); 
print 'Areas Inter '.join(map(str,areas)); 

for i in range(0,len(areas)-1): 
    if p.getDistance(points[i],pedges[i])< 0.0001: #Distance between a point and an edge 
     areas_onEdge.append(areas[i]) 
    else: 
     areas_inside.append(areas[i]) 

result=sum(areas_inside)/areaShell 

EDITED

基於馬特烏斯答案:

for i in range(len(areas)): 
    is_on_edge = False 

    for j in range(len(pedges)): 
     if p.getDistance(points[i], pedges[i]) < 0.0001: 
      areas_onEdge.append(areas[i]) 
      is_on_edge = True 

    if not is_on_edge: 
     areas_inside.append(areas[i]) 

有沒有可能來壓縮這樣的三份名單,以獲得比 'RATT'?

for point, area,areaR in zip(pointsInter_proj, areasInter,areasRev): 
    edges_distances = [p.getDistance(point, pedge) for pedge in pedges] 
    if min(edges_distances) >=0: 
     ratt.append(area/areaR); 
+2

不工作,請澄清你的問題! – Arman

+1

你遇到的問題在哪裏?得到任何錯誤或錯誤的結果? –

+0

最有可能的是,你的問題是,你只檢查一個邊的一個點。你需要檢查每個邊的一個點,看看該點是否在給定多邊形的任何邊上。 – Lafexlos

回答

0

可能是,你的問題在於for循環。

首先,由於您的範圍只能達到len(areas)-1,因此您並未遍歷所有區域。在Python中,範圍的結束分隔符不包含在生成的列表中,例如,range(0, 5)生成列表[0, 1, 2, 3, 4]

此外,你只是比較每個點只有一個邊緣,並據我所知,你想比較一個點對所有邊緣。

這個循環糾正了我這裏介紹兩個點:

for i in range(len(areas)): 
    is_on_edge = False 

    for j in range(len(pedges)): 
     if p.getDistance(points[i], pedges[j]) < 0.0001: 
      areas_onEdge.append(areas[i]) 
      is_on_edge = True 
      break 

    if not is_on_edge: 
     areas_inside.append(areas[i]) 

這是(在我看來,更符合Python)做同樣的事情的另一種方式:您可以通過_dosen意思

for point, area in zip(points, areas): 
    edges_distances = [p.getDistance(point, pedge) for pedge in pedges] 

    if min(edges_distances) < 0.0001: 
     areas_onEdge.append(area) 
    else: 
     areas_inside.append(area) 
+1

對於你的第一個解決方案,如果找到你應該跳出你的'j'循環。找到後不需要繼續迭代。另外,'pedges [j]' – Lafexlos

+0

是否可以做類似的壓縮3個列表?看到我的編輯 – user3641829

+0

當然,你可以一起壓縮3個列表。請注意,zip會將所有列表限制爲最小列表的大小。例如。如果兩個列表「a,b」各有10個元素,第三個「c」只包含5個元素,則壓縮列表zip(a,b,c)將包含5個元素。在這裏看到更多:http://stackoverflow.com/questions/13704860/zip-lists-in-python –