给定两个点和两个向量,找到交点

时间:2013-01-10 11:08:55

标签: c++ math vector-graphics

  

可能重复:
  How do you detect where two line segments intersect?

鉴于两个点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,因为点和矢量之间的唯一区别在于它是通过仿射变换转换的方式。

2 个答案:

答案 0 :(得分:1)

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

让我们将第一个Ray称为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都存在真实但至少有一个否定解决方案,则延伸光线相交。

答案 1 :(得分: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  

希望能帮到你。