Пересечение двух плоскостей - делим на ноль - PullRequest
0 голосов
/ 10 мая 2018

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

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 )

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

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

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

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

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#comment5706281_2766615

1 Ответ

0 голосов
/ 10 мая 2018

Короче говоря, вы должны реализовать алгоритм пересечения для случая, когда (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

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

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

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

...