两个平面的相交 - 除以零

Intersect of two planes - divide by zero

我有以下算法来找到两个平面的直线交点:

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 )

在某些情况下,这个表达式的值等于零,所以我得到一个 "dividing by zero" 错误:(

遇到这种情况怎么办?

我知道,这个表达式等于零的情况并不意味着没有交集,因为当我有垂直于其中一个轴的平面时会发生这种情况。

例如:

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

简而言之,您必须针对 (a1*b2 - a2*b1) = 0 的情况(即当设置 z=0 时平面不独立)实现交集算法。

要对此进行扩展,首先我们需要了解您是如何做到这一点的。首先让我们写下两个平面的方程式:

a1x + b1y + c1z + d1 = 0

a2x + b2y + c2z + d2 = 0

当两个平面相交时,交点是一条线。因此,解决该问题的最常用方法是首先在这样的直线上找到一个点,然后根据您的情况确定其方向(a,b,c)。方向是一个直接的叉积。交点通常是通过将其中一个坐标设置为 0,然后求解得到的 2 个线性方程式来计算的。在您的代码中,这是通过设置完成的:

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) 为非零值。这有帮助吗?