web-dev-qa-db-ja.com

平面点のどちら側にあるかを確認する

私は3Dポイントの配列と平面を取得し、それらが平面のどちら側にあるかに基づいて、ポイントを2つの配列に分割しようとしています。デバッグに深く入る前に、これからどうするかについて私の理解が機能することを確認するために、私が計画していることを投稿したいと思いました。

基本的に私は3点の平面を使用しており(疑似コード)を使用します。

var v1 = new vector(plane.b.x-plane.a.x, plane.b.y-plane.a.y, plane.b.z-plane.a.z);
var v2 = new vector(plane.c.x-plane.a.x, plane.c.y-plane.a.y, plane.c.z-plane.a.z);

これら2つのベクトルの外積をとって、法線ベクトルを取得します。

次に、ポイントの配列をループしてそれらをベクトルに変換し、法線に対するドット積を計算します。

次に、内積を使用して、ポイントがある側を決定します。

これはうまくいくと思いますか?

20
GameDever

a*x+b*y+c*z+d=0は、飛行機を決定する方程式です。

[x,y,z]座標の左側にある点の座標(つまり、a*x+b*y+c*z+d)と結果の記号を見てください。

同じ符号のポイントは、平面の同じ側にあります。

正直、あなたの書いた内容の詳細は調べませんでした。私が提案することの方が簡単であることにあなたは同意するでしょう。

25
Ali

以前に与えられた「平面の方程式にポイントを置き、サインをチェックする」アプローチに従います。方程式は SymPy を使用して簡単に取得できます。私はそれを使用して、ポイントのリストからポイントの場所(numpy配列として保存)を見つけました。

from sympy import Point3D, Plane
plane=Plane(Point3D(point1), Point3D(point2), Point3D(point3))
for point in pointList:
        if plane.equation(x=point[0], y=point[1],z=point[2]) > 0:
            print "point is on side A"
        else:
            print "point is on side B"

上記の他の方法と比較して速度をテストしていませんが、間違いなく最も簡単な方法です。

1
Josh

あなたのアプローチはいいですね。しかし、「それらをベクトルに変換する」と言った場合、(文章の意味によっては)うまくいかない場合があります。

現在のポイントと平面内のポイントの1つの間の座標の違いを計算することにより、「ポイントをベクトルに変換」する必要があります(たとえば、 、平面を定義する3つの点の1つ)。あなたが書いたように、あなたはそれを誤解しているようです。それ以外は大丈夫です!

1
nbonneel