前回私が整形したものを使用しましたが、実際には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)
た代わりに私が得たもの
:それは、以下の青い点で示されています。
奇妙なことに、多角形/三角形が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
リターンを行い、なぜそれは何
ライン?
欲しいものを整えている機能がありますか?任意の引数、微調整または暗いマジックトリック?
シンプルさと怠惰という私の夢を実現しながら、この仕事をするライブラリがありますか?