2016-08-16 11 views
0

I`m 2つの多角形のクロスオーバーの差を示しLinearRingプロットしようとしている:DIFプロットしたいI`dパイソン:LinearRingの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のx、y、z座標を取得し、それらをプロットしてみてください。

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

を私は「『ポリゴン』オブジェクトが反復可能ではありませんTypeError例外」と言ってerrosを取得しますしかし、私は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()  

を私はその後、私は後の午前プロットを得るが、I`mはDIFをプロットする簡単な方法を探しています。もしあれば、このコードで、

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

は用心しても、あなたのソリューションで、あなたは、多角形の内部リングを失うされていますexterior

答えて

1

あなたがCOORDSを得ることができ、使用している属性。

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) 

IMHO、3Dポリゴンで見栄えを使用すると、見栄えだけで、2Dポリゴンを処理するので、誤解を招く、とあれば、あなたに問題をもたらしますShapelyを使用するコード全体に3Dパーツを広げます。さらに、コードを読んでいる人は、実際にあなたがそうでないときに3D数学をやっていると思うかもしれません。おそらく、すべての2D計算を綿密に分離し、その後に3D部品を追加することができます。

関連する問題