步骤如下:
1.根据给定的两条线段确定平面(该平面均平行于该两条异面直线)
2.求取投影点,在给定的平面内,求取交点
3.获取投影点对应曲线上的点
构造平面的方法:
利用平面标准方程,来构造平面A*x + B*y + C*z +D = 0;
<pre name="code" class="csharp"> class MyPlane
{
/// <summary>
/// 构造平面
/// </summary>
public MyPlane(double A, double B, double C, double D)
{
_A = A;
_B = B;
_C = C;
_D = D;
}
/// <summary>
/// 求取点到平面的距离
/// </summary>
public double getDis(XYZ pt)
{
return (_A * pt.X + _B * pt.Y + _C * pt.Z + _D) / (Math.Sqrt(_A * _A + _B * _B + _C * _C));
}
/// <summary>
/// 求取点到面的投影点
/// </summary>
public XYZ getPtPjt(XYZ pt)
{
double k = -1 * getDis(pt) / Math.Sqrt(_A * _A + _B * _B + _C * _C);
double x = pt.X + k * _A;
double y = pt.Y + k * _B;
double z = pt.Z + k * _C;
return new XYZ(x, y, z);
}
private double _A;
private double _B;
private double _C;
private double _D;
};
根据两条线段,构造平面:
XYZ pt1 = left.Start;
XYZ pt2 = left.End;
XYZ pt3 = right.Start;
XYZ pt4 = right.End;
XYZ vecX = (pt2 - pt1).Normalize();
XYZ vecY = (pt4 - pt3).Normalize();
XYZ cross = vecX.CrossProduct(vecY);
// 以第二条直线为准
double A = cross.X;
double B = cross.Y;
double C = cross.Z;
double D = -cross.X * pt3.X - cross.Y * pt3.Y - cross.Z * pt3.Z;
MyPlane plane = new MyPlane(A,B,C,D);