给定两个点和两个矢量,找到交点[复制](Given two points and two vecto

2019-07-18 01:19发布

可能重复:
你如何发现其中两条线段相交?

给定两个点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;

ab也是类型的vector2 ,因为一个点和向量之间的唯一区别是在它是由仿射变换变换的方式。

Answer 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  

希望帮你。



Answer 2:

看起来像一个分配问题给我。 下面是这将有助于你写的代码逻辑。

让我们把第一缕曙光R0
上的点的轨迹R0定义为P

P = P0 + alpha x V0

对于第二射线R1

P = P1 + beta x V1

因为他们应该相交:

P0 + alpha x V0 = P1 + beta x V1

alphabeta是未知数,我们有两个方程x任何y

求解未知数并取回交点。

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

解决alphabeta

如果有两个正实数解alphabeta ,射线相交。
如果有两个一真实的,但至少一个负溶液alphabeta ,扩展射线相交。



文章来源: Given two points and two vectors, find point of intersection [duplicate]