2017-11-17 47 views
1

前回私が整形したものを使用しましたが、実際にはthis nice import-and-fly-feelingでした。 しかし、最近、私は3D空間で線分と三角形の交点を見つけようとしたので、このモジュールでは直感的ではない動作をします。セグメントと次のように三角形を定義してみましょう:Shapely:3Dのラインとポリゴンの交点

l = LineString([[1,0.5,0.5],[3,0.5,0.5]]) 
p = Polygon([[1.2,0.0,0.],[2.2,1.0,0.],[2.8,0.5,1.]]) 

交差点の彼らのポイントを得るために、私はすなわちPOINT Z (POINT Z (2 0.5 0.25))l.intersection(p)を使用して、ポイントを予想。下の赤い線 - - と率直に言って、私は表すようになっているかについて、非常に当惑していますLINESTRING Z (1.7 0.5 0.25, 2.8 0.5 1)た代わりに私が得たもの

enter image description here

:それは、以下の青い点で示されています。

奇妙なことに、多角形/三角形がxz平面にあり、線分と直交する場合、関数は期待どおりに動作します。しかし、三角形が "傾いている"ときは、線を返します。これは一時的に私に、線と三角形の境界ボックスの交点が返ってきたと思うようになりました。上記の赤い線はそうでないことを証明します。

この問題を回避するには、this very enlightening web-pageを読んで、C++コードを艶のあるオブジェクトで使用するように修正してください。 intersectionメソッドは、線がポリゴンを通過しているかどうかを確認するのに効果的です。以下の関数が注目点を見つけ出します。私の質問に非常に

def intersect3D_SegmentPlane(Segment, Plane): 

    # Points in Segment: Pn Points in Plane: Qn 
    P0, P1  = np.array(Segment.coords) 
    Q0, Q1, Q2 = np.array(Plane.exterior)[:-1] 

    # vectors in Plane 
    q1 = Q1 - Q0 
    q2 = Q2 - Q0 

    # vector normal to Plane 
    n = np.cross(q1, q2)/np.linalg.norm(np.cross(q1, q2)) 
    u = P1 - P0 # Segment's direction vector 
    w = P0 - Q0 # vector from plane ref point to segment ref point 

    ## Tests parallelism 
    if np.dot(n, u) == 0: 
     print "Segment and plane are parallel" 
     print "Either Segment is entirely in Plane or they never intersect." 
     return None 
    ## if intersection is a point 
    else: 
     ## Si is the scalar where P(Si) = P0 + Si*u lies in Plane 
     Si = np.dot(-n, w)/np.dot(n, u) 
     PSi = P0 + Si * u 
     return PSi 

ないもはや輸入と-飛ぶ...だから最後に

3D-オブジェクトに適用された場合 intersectionリターンを行い、なぜそれは何
  • ライン?

  • 欲しいものを整えている機能がありますか?任意の引数、微調整または暗いマジックトリック?

  • シンプルさと怠惰という私の夢を実現しながら、この仕事をするライブラリがありますか?

答えて

1

残念ながら、ドキュメントは述べて:

は、シーケンスは不変でコーディネート。第3のz座標値は、インスタンスを構成するときに使用されるが、幾何学的解析には影響を与えない。すべての演算はx-y平面で実行されます。でも

from shapely.geometry import LineString, Polygon 

l = LineString([[1,0.5,0.5],[3,0.5,0.5]]) 
p = Polygon([[1.2,0.0,0.],[2.2,1.0,0.],[2.8,0.5,1.]]) 
print(l.intersection(p)) 
#LINESTRING Z (1.7 0.5 0.25, 2.8 0.5 1) 

l = LineString([[1,0.5],[3,0.5]]) 
p = Polygon([[1.2,0.0],[2.2,1.0],[2.8,0.5]]) 
print(l.intersection(p)) 
#LINESTRING (1.7 0.5, 2.8 0.5) 

か::

from shapely.geometry import LineString, Polygon 

l = LineString([[1,0.5,0],[3,0.5,0]]) 
p = Polygon([[1.2,0.0,1],[2.2,1.0,1],[2.8,0.5,1]]) 
print(l.intersects(p)) 
#True (even though the objects are in different z-planes) 

一つはでこれを確認することができます

関連する問題