4

可能重复:
如何检测两条线段相交的位置?

给定两个点ab两个向量vu我想找到第三个点c,它是以下方式的交点:

vector2 intersection(vector2 a, vector2 v, vector2 b, vector2 u)
{
    float r, s;

    a + r * v = b + s * u;
    r * v - s * u = b - a

    r * v.x - s * u.x = b.x - a.x
    r * v.y - s * u.y = b.y - a.y
}

除了使用高斯消元法来解决这个系统,还有其他方法吗?或者这是处理这个问题的最佳(或至少是可接受的)方式?

编辑:定义vector2

typedef union vector2
{
    float v[2];
    struct { float x, y; };
} vector2;

a并且b也是 type vector2,因为点和向量之间的唯一区别在于它通过仿射变换进行变换的方式。

4

2 回答 2

1

对我来说似乎是一个分配问题。这是帮助您编写代码的逻辑。

让我们称第一条射线为R0
点的轨迹R0定义为P

P = P0 + alpha x V0

对于第二条射线R1

P = P1 + beta x V1

因为它们应该相交:

P0 + alpha x V0 = P1 + beta x V1

alphabeta是未知数,我们在xany中有两个方程y

解决未知数并返回交点。

IE,

P0.x + alpha * V0.x = P1.x + beta * V1.x
P0.y + alpha * V0.y = P1.y + beta * V1.y

解决alphabeta

如果 和 都有一个真正的正解,则alpha光线beta相交。
如果 和 都有一个实数但至少有一个负解,则alpha扩展beta射线相交。

于 2013-01-10T11:24:37.933 回答
1

这是简单的数学。

但是,首先,检查您是否有交集。如果两个向量都是平行的,您将无法解决:

// Edit this line to protect from division by 0 
if (Vy == 0 && Uy == 0) || ((Vy != 0 && Uy != 0 && (Vx/Vy == Ux/Uy)) // => Fail.

然后(我不会显示计算,因为它们很长,但结果是):

R = (AxUy - AyUx + ByUx - BxUy) / (VyUx - VxUy)  
S = (Ax - Bx + RVx) / Ux  

希望对你有所帮助。

于 2013-01-10T12:04:35.127 回答