平面和平面的交线算法?我知道平面方程
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个点,就定跟直线,如何返回他们的交线?
谢谢!
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,0,z1)和(0,1,z2)如果z=0平面和y=0平面
交线不就是x轴啊。。怎么会有(1,0,z1)和(0,1,z2)这两个点呢。。
{
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;
}