Пересечение двух плоскостей - делим на ноль

У меня есть следующий алгоритм, чтобы найти пересечение линии двух плоскостей:

public static function getIntersectOf2Planes ( self $P1 , self $P2 )
{
    /*  Line equation in parametric form:
            x = x0 + t*a
            y = y0 + t*b
            z = z0 + t*c
        */
    $x0 = ( $P1->B * $P2->D - $P2->B * $P1->D ) / ( $P1->A * $P2->B - $P2->A * $P1->B ) ;
    $a = ( $P1->B * $P2->C - $P2->B * $P1->C );
    $y0 = ( $P2->A * $P1->D - $P1->A * $P2->D ) / ( $P1->A * $P2->B - $P2->A * $P1->B ) ;
    $b = ( $P2->A * $P1->C - $P1->A * $P2->C );
    $z0 = 0;
    $c = (  $P1->A * $P2->B - $P2->A * $P1->B );

    $IntersectionLine = new Line3D( $x0, $a, $y0, $b, $z0, $c );

    return $IntersectionLine;
}

и это прекрасно работает, но для вычисления $x0 и $y0 мне нужно разделить на:

( $P1->A * $P2->B - $P2->A * $P1->B )

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

Что мне делать в этом случае?

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

Например для:

Plane1:
A = 0
B = 0
C = 100
D = 0

Plane2:
A = 50
B = 0
C = 0
D = -250

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

PS Я написал этот код с целью: https://math.stackexchange.com/questions/2766615/line-by-two-planes-intersection?noredirect=1

1 ответ

Решение

Короче говоря, вы должны реализовать алгоритм пересечения для случая, когда (a1*b2 - a2*b1) = 0 (т. Е. Когда плоскости не являются независимыми, когда вы устанавливаете z=0).

Чтобы углубиться в это, сначала нам нужно понять, как вы продвинулись так далеко. Сначала запишем уравнение двух плоскостей:

a1x + b1y + c1z + d1 = 0

а также

a2x + b2y + c2z + d2 = 0

Когда две плоскости пересекаются, пересечение - это линия. Итак, самый обычный способ решить эту проблему - сначала найти точку на такой линии, а затем выяснить ее ориентацию (a, b, c) в вашем случае. Ориентация является прямым перекрестным произведением. Точка пересечения обычно рассчитывается путем установки одной из координат равной 0 и последующего решения двух полученных линейных уравнений. В вашем коде это делается установкой:

z = 0

Но это работает только тогда, когда уравнения

a1x + b1y + d1 = 0 and a2x + b2y + d2 = 0

способны дать решение для х и у, а это не тот случай, когда a1b2-a2b1=0. Таким образом, в таких случаях вы можете решить то же самое, установив x или y в 0, что снова дает два линейных уравнения, которые вы можете решить, чтобы получить точку на линии. Затем вы можете вычислить параметрическую форму так же, как вы это сделали. Например (установка y в 0):

x0 = (c1d2 - c2d1)/(a1c2 - a2c1)
y0 = 0
z0 = (a2d1 - a1d2)/(a1c2 - a2c1)

Но для того, чтобы это было определенное значение, вы должны иметь (a1c2 - a2c1), чтобы быть ненулевым. Это помогает?

Другие вопросы по тегам