Пересечение двух плоскостей - делим на ноль
У меня есть следующий алгоритм, чтобы найти пересечение линии двух плоскостей:
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), чтобы быть ненулевым. Это помогает?