首先具备点到直线的距离点的求解能力,不会点到直线的距离的请看
https://blog.csdn.net/qq_35267906/article/details/91954743
已知:直线p1p2,和直线p3p4求这2根空间直线的交点。
这里求证了2个直线的交点,但前提条件是2个直线必须在同个平面才有交点。
/// <summary>
/// 线与线的交点
/// </summary>
/// <param name="p1"></param>
/// <param name="p2"></param>
/// <param name="p3"></param>
/// <param name="p4"></param>
/// <returns>-1 重合,0 没有交点,1 一个交点</returns>
public static int LineToLinePoint(Vector3 p1, Vector3 p2, Vector3 p3, Vector3 p4, out Vector3 rp1,out Vector3 rp2)
{
//线判断线是不是平行
rp1 = null;
rp2 = null;
Vector3 n1 = (p2 - p1).Normalized();
Vector3 n2 = (p4 - p3).Normalized();
if (System.Math.Abs(Dot(n1, n2)) == 1)
{
//平行
if (System.Math.Abs(Dot(p3 - p1, n2)) == 1 || p3 == p1)
{
//重合
rp1 = p1;
rp2 = p2;
return -1;
}
else
{
return 0;
}
}
Vector3 pn = PointToLineDistancePoint(p1, p2, p3);
//判断是不是在一个平面
Vector3 f1 = Cross(n1, n2).Normalized();
Vector3 f2 = Cross((p3 - p1).Normalized(), n2).Normalized();
if (System.Math.Abs(Dot(f1, f2)) != 1 && p3 != p1)
{
return 0;
}
float L = (pn - p3).modular / Dot(n2.Normalized(), (pn - p3).Normalized());
rp1 = p3 + L * n2;
return 1;
}
里面处理了平行和重合的情况,和判断是不是在一个平面。