2013-01-10 175 views
3

可能重复:
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 
} 

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

EDIT: 定义的vector2

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

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

+1

'vector2'是如何定义的?为什么* points * a和b也是'vector2'类型? –

+0

我的解释如下。但不管。为什么vector不仅仅是一个结构?为什么你需要工会和“阵列”? –

+0

这个问题已被Gareth Rees,Paul R,Mark Dickinson和0xbadf00d标记为重复,因为“此问题已被询问并且已经有答案。”。 **但是**这个问题在撰写本文时没有被接受的答案。我不认为应该将问题标记为重复,除非所引用的问题具有可接受的答案。 – user316117

回答

1

对我来说看起来像一个任务问题。这是可以帮助你编写代码的逻辑。

让我们称第一个雷为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

这是简单的数学。

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

// 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 

希望有所帮助你。

+0

如果将[(a.x -b.x + r * v.x)/ u')分开,结果如何?假设'u'是一个向量,'(a.x-b.x + r * v.x)'是一个标量? – 0xbadf00d

+0

@ 0xbadf00d你更正了,这是一个错字。我的意思是Ux ... –

+0

如果* Ux = 0 *会怎么样?例如:* v1 =(0,1)*,* v2 =(2,0)*和* p1 =( - 4,2)*,* p2 =(3,5)*? –