2016-08-16 70 views
0

我真的想要繪製一個線性環,顯示兩個多邊形的交叉的區別:蟒蛇勻稱:檢索X,Y,Z一個線性環值

import mpl_toolkits.mplot3d as a3 
import matplotlib.pyplot as plt 
from shapely.geometry import Polygon 
fig = plt.figure() 
ax = Axes3D(fig) 

poly1 = Polygon([(220.0, 780, 500), (840, 780, 500), (840, 180, 500), (220.0, 180, 500)]) 
poly2 = Polygon ([(320.0, 380, 500), (740, 380, 500), (740, 180, 500), (320.0, 180, 500)]) 

dif = poly1.difference(poly2) 

我想要一份繪製DIF然而,當使用:

top1 = a3.art3d.Poly3DCollection([dif],alpha=0.6) 

我得到一個錯誤回報說:「類型錯誤:‘多邊形’對象不是可迭代」

因此,我試圖讓X,Y,DIF的Z座標,並繪製出來,但我只能設法得到x,y 那些。爲了測試的緣故,我目前饋入的Z值manualy:

z= [500,500,500,500,500,500,500,500] 
x,y = a.exterior.xy 

zipped = list(zip (x,y,z)) 
top1 = a3.art3d.Poly3DCollection([zipped],alpha=0.6) 
top1.set_color('wheat') 
top1.set_edgecolor('k')   
ax.add_collection3d(top1) 

ax.set_xlim(0, 1000) 
ax.set_ylim(0, 1000) 
ax.set_zlim(0, 1000) 
plt.show()  

然後我得到我之後的情節,但我在找一個更簡單的方法來繪製DIF。

回答

1

隨着exterior屬性你使用,你可以得到的座標:

top1 = a3.art3d.Poly3DCollection([dif.exterior.coords],alpha=0.6) 

當心,這個代碼,並與您的解決方案,你正在失去多邊形的內環,如果有任何。

請注意,coords返回一個迭代,如果你想要一個列表,你必須創建它(list(dif.exterior.coords))。

對於內環多邊形,你可以處理它在這個例子:

poly = Point(0,0).buffer(500) 
poly = Polygon([ (x, y, 500) for x, y in poly.exterior.coords ]) 
spoly = Point(0,0).buffer(200) 
spoly = Polygon([ (x, y, 500) for x, y in spoly.exterior.coords ]) 
poly = poly.difference(spoly) 

all_coords = [p.coords for p in poly.interiors] 
all_coords.append(poly.exterior.coords) 
top1 = a3.art3d.Poly3DCollection(all_coords,alpha=0.6) 

恕我直言,用勻稱的3D多邊形是一種誤導,因爲身材勻稱只處理2D多邊形,如果將帶給你的問題您將3D零件遍佈在使用Shapely的代碼中。此外,有人閱讀代碼可能會認爲你實際上是在做3D數學,而不是。也許你可以用形狀來隔離所有的2D計算,然後添加它的3D部分。

相關問題