录十六

持之以恒

求直线与面的交点

如下图所示,已知面的法向量为N=(A,B,C),且M是面上确定的一点,求直线P1P2与平面的交点P。

1ddd.png

根据向量的基本知识,可知:

P = P1 + u (P2 - P1)

由于点P属于平面,根据面的点法式方程有:

N • (P - M) = 0

根据以上两式消去P,可得:

N • (P1 + u (P2 - P1)) = NM

解上面的方程,则:

6.png


typedef struct Point3D
{
    Point3D()
      :x(0.0f),y(0.0f),z(0.0f)
    {
        
    }
 
    Point3D(float fx,float fy,float fz)
      :x(fz),y(fy),z(fz)
    {
        
    }
    
    float x;
    float y;
    float z;
    
}Point3D;


bool IntersectionLinePlane(const Point3D& N, const Point3D& M, const Point3D& P1, const Point3D& P2, Point3D* P)
{
    Point3D  P2_P1;

    P2_P1.x = P2.x - P1.x;
    P2_P1.y = P2.y - P1.y;
    P2_P1.z = P2.z - P1.z;
    
    float denom = P2_P1.x*N.x + P2_P1.y*N.y + P2_P1.z*N.z;
    
    if (denom == 0.0f)
    {
        return false;
    }
    else
    {
        float numer = (M.x - P1.x)*N.x + (M.y - P1.y)*N.y + (M.z - P1.z)*N.z;
        
        float u = numer / denom;
        
        P->x =  P1.x + u * P2_P1.x;
        P->y =  P1.y + u * P2_P1.y;
        P->y =  P1.z + u * P2_P1.z;
        
        return  true;
    }
}


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Copyright © 1999-2019, lu16.com, All Rights Reserved