【问题标题】:Given two points and two vectors, find point of intersection [duplicate]给定两个点和两个向量,找到交点[重复]
【发布时间】:2013-01-10 11:08:55
【问题描述】:

可能重复:
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 类型,因为点和向量之间的唯一区别在于它通过仿射变换进行变换的方式。

【问题讨论】:

  • vector2 是如何定义的?为什么 points a 和 b 也是 vector2 类型的?
  • 我的解释如下。但不管。为什么向量不只是一个结构?为什么需要联合和“数组”?
  • 此问题已被 Gareth Rees、Paul R、Mark Dickinson 和 0xbadf00d 标记为重复,因为“此问题之前已被问过并且已经有答案。”。 但是截至撰写本文时,该问题还没有公认的答案。我认为除非引用的问题具有可接受的答案,否则不应将问题标记为重复。

标签: c++ math vector-graphics


【解决方案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 any y 中有两个方程。

解决未知数并返回交点。

即,

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

求解alphabeta

如果alphabeta 都存在真正的正解,则射线相交。
如果alphabeta 都存在一个真实但至少一个负解,则扩展射线相交。

【讨论】:

    【解决方案2】:

    这是简单的数学运算。

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

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

    希望对你有所帮助。

    【讨论】:

    • (a.x - b.x + r * v.x) / u分开会是什么结果?假设u 是向量,(a.x - b.x + r * v.x) 是标量?
    • @0xbadf00d 你说得对,这是一个错字。我的意思是 Ux...
    • 如果 Ux=0 会怎样?示例:v1=(0,1)v2=(2,0)p1=(-4,2)p2=(3,5)?
    猜你喜欢
    • 1970-01-01
    • 2013-12-04
    • 2017-09-26
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 2021-02-15
    • 2021-10-26
    • 1970-01-01
    相关资源
    最近更新 更多