??????今天突然发现以前做平面非平行直线相交是有问题的,和以前博客关联太多了,必须得专门写一篇纠错。 ??????只能说以前刚好没碰到这种情况,太神奇了,代码如下:
private Vector2 CalculateLineCross(Vector2 p1, Vector2 p2, Vector2 p4, Vector2 p3)
{
float k1 = (p2.y - p1.y) / (p2.x - p1.x);
float a1 = p2.y - k1 * p2.x;
float k2 = (p3.y - p4.y) / (p3.x - p4.x);
float a2 = p3.y - k2 * p3.x;
float y = (k2 * a1 - k1 * a2) / (k2 - k1);
float x = 0;
if (k1 != 0)
{
x = (y - a1) / k1;
}
else if (k2 != 0)
{
x = (y - a2) / k2;
}
return new Vector2(x, y);
}
??????看出问题了吧,如果(p2.x - p1.x),或者(p3.x - p4.x)等于0,那么斜率k就是不存在的,基于这个不存在的斜率k计算的结果就是错的。 ??????但是c#数学运算分母=0不报错和刚好实际开发场景又没碰到斜率k不存在的计算结果,就忽视了。 ??????所以现在得补全这个计算的适应性,使用直线方程组求解,如下: ??????那么我们只需要通过四个坐标构建直线方程参数就行了,如下:
??????接下来构建算法:
private Vector2 CalculateLineCross(Vector2 p1, Vector2 p2, Vector2 p4, Vector2 p3)
{
float[] abc1 = GetLineEquationParams(p1, p2);
float[] abc2 = GetLineEquationParams(p4, p3);
float a1 = abc1[0], b1 = abc1[1], c1 = abc1[2];
float a2 = abc2[0], b2 = abc2[1], c2 = abc2[2];
float x = (c2 * b1 - c1 * b2) / (a1 * b2 - a2 * b1);
float y = (c2 * a1 - c1 * a2) / (b1 * a2 - b2 * a1);
return new Vector2(x, y);
}
private float[] GetLineEquationParams(Vector2 p1, Vector2 p2)
{
float a, b, c;
if (p1.y == p2.y)
{
a = 0;
b = 1;
c = -p1.y;
}
else if (p1.x == p2.x)
{
a = 1;
b = 0;
c = -p1.x;
}
else
{
float k = (p2.y - p1.y) / (p2.x - p1.x);
a = k;
b = -1;
c = p1.y - k * p1.x;
}
return new float[] { a, b, c };
}
??????刚好以实际项目测试,效果如下: ??????这样就是平面非平行直线相交的修正方法。
|