平面和平面的交线算法?我知道平面方程
a1x+b1y+c1z+d1=0;
a2x+b2y+c2z+d2=0;连立得:
(a1-a2)x+(b1-b2)y+(c1-c2)z+(d1-d2)=0;现在需要返回一个直线,即两个点~
  public Line3D CrossPlane(Plane3D p) //求平面与平面的交线
        {
            Line3D CrossLine = new Line3D();
            float tempA = (p.d - d) - (norm.x - p.norm.x);
            float tempB = (p.d - d) - (norm.y - p.norm.y);
            float tempC = norm.z - p.norm.z;
            if (tempC != 0)
            {
                CrossLine.ptBegin.x = 1;
                CrossLine.ptBegin.y = 0;
                CrossLine.ptBegin.z = tempA /tempC;                CrossLine.ptEnd.x = 0;
                CrossLine.ptEnd.y = 1;
                CrossLine.ptEnd.z = tempB / tempC;                return CrossLine;
            }
            else
            {
                return null;
            }
            
        }感觉有问题,我定了2个点,就定跟直线,如何返回他们的交线?
谢谢!

解决方案 »

  1.   

    随便确定两组(x,y)、(x,y),算出z,不就得到两个(x,y,z)、(x,y,z)了吗,这不就可以确定直线了吗?
      

  2.   

    我就是楼上的方法做的啊。。但是有点不对
    (1,0,z1)和(0,1,z2)如果z=0平面和y=0平面
    交线不就是x轴啊。。怎么会有(1,0,z1)和(0,1,z2)这两个点呢。。
      

  3.   

    bool PlanesIntersect(GVector3d*dir,GVector3d*onept,GPlane*plane1,GPlane*plane2)
    {
    if(!dir||!onept||!plane1||!plane2)return false; D3DXPLANE normalizplane1,normalizplane2;//标准平面
    D3DXVECTOR3 normal1,normal2;//平面法线
    D3DXPlaneNormalize(&normalizplane1,plane1);
    D3DXPlaneNormalize(&normalizplane2,plane2);
        
    normal1.x = normalizplane1.a;normal1.y = normalizplane1.b;normal1.z = normalizplane1.c;
    normal2.x = normalizplane2.a;normal2.y = normalizplane2.b;normal2.z = normalizplane2.c; //所求交线的方向
    D3DXVec3Cross(dir,&normal1,&normal2); if(D3DXVec3Dot(dir,dir)<PKPM_PRESISION)
    return false;
    //求直线上一点,点即在plane1上,又在plane2上
    float dot = D3DXVec3Dot(&normal1,&normal2);
    float s1 = normalizplane1.d;
    float s2 = normalizplane2.d;
    float norma11sqr = D3DXVec3Dot(&normal1,&normal1);
    float normal2sqr = D3DXVec3Dot(&normal2,&normal2);
    float a = (s2*dot - s1*normal2sqr);
    float b = (s1*dot - s2*norma11sqr); *onept = a*normal1 + b*normal2;
    return true;
    }