Подтвердить что ты не робот

Проверьте, какая сторона плоских точек включена

Я пытаюсь взять массив трехмерных точек и плоскость и разделить точки на 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);

Я беру поперечное произведение этих двух векторов, чтобы получить нормальный вектор.

Затем я просматриваю свой массив точек и превращаю их в векторы и вычисляю точечный продукт на нормальный.

Затем я использую точечный продукт, чтобы определить сторону, в которой находится точка.

Звучит ли это так, как будто это сработает?

4b9b3361

Ответ 1

Пусть a*x+b*y+c*z+d=0 - уравнение, определяющее ваш самолет.

Подставьте [x,y,z] координаты точки в левую часть уравнения (я имею в виду a*x+b*y+c*z+d) и посмотрим на знак результата.

Точки, имеющие один и тот же знак, находятся на одной стороне плоскости.

Честно говоря, я не изучил детали того, что вы написали. Думаю, вы согласны с тем, что предлагаемое мной проще.

Ответ 2

Ваш подход звучит неплохо. Однако, когда вы говорите "и превращаете их в векторы", это может быть не очень хорошо (в зависимости от значения вашего предложения).

Вы должны "превратить свои точки в вектор", вычислив разницу в терминах координат между текущей точкой и одной из точек в плоскости (например, одна из трех точек, определяющих самолет). Как вы ее написали, похоже, что вы, возможно, неправильно поняли это; но кроме этого, это нормально!

Ответ 3

Следуя принципу "положи точки в уравнение плоскости и проверь знак", приведенному ранее. Уравнение может быть легко получено с помощью SymPy. Я использовал его, чтобы найти расположение точек (сохраненных в виде массивов) в списке точек.

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"

Я не проверял его скорость по сравнению с другими методами, упомянутыми выше, но это определенно самый простой метод.