Geometry 两个平面相交-除以零

Geometry 两个平面相交-除以零,geometry,intersection,divide-by-zero,Geometry,Intersection,Divide By Zero,我使用以下alghoritm来查找两个平面的直线交点: 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 *

我使用以下alghoritm来查找两个平面的直线交点:

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;
}
a1x + b1y + c1z + d1 = 0
这很好,但要计算$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我写这段代码是为了:

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

为了进一步说明这一点,首先我们需要了解你是如何做到这一点的。首先让我们写下两个平面的方程:

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;
}
a1x + b1y + c1z + d1 = 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):


但要使其成为一个定义值,你需要(a1c2-a2c1)为非零。这有帮助吗?

是的,就是它!谢谢!好吧,但现在的问题是,当第一个平面是pararell do XY,第二个平面是pararell to YZ;我需要第三个“if语句”。x0=0的方程应该是什么?为什么?:)你可以把x=0放在两个平面方程中,然后求解y和z。你应该试试:)