给定两个点和两个方向向量,找到它们相交的点

时间:2014-12-13 13:02:17

标签: vector point intersection direction

编辑:这不是重复,请阅读问题描述

为了清楚起见,这些细分市场没有终点。它们从一个点开始,并根据方向向量进入无穷大。我找到了有限线段的解决方案,但它们并不适用于这种特殊情况(我认为)。

所以,标题基本上是我的整个问题 - 我已经

  1. point p1
  2. point p2
  3. 方向向量n1(归一化向量)
  4. 方向向量n2(归一化向量)
  5. 第一个线段从p1开始,指向n1

    第二个线段从p2开始,指向n2

    我需要两个答案:

    1. 如果他们相交并且
    2. 什么是交叉点
    3. 我已经找到了这两个答案,但我在数学上非常糟糕,以至于我无法调整它们以适应我的问题,但我希望它可以帮助你们。

        

      How do you detect where two line segments intersect?

        

      Given two points and two vectors, find point of intersection

      非常感谢!

      编辑:(顺便说一下,我在2D Space工作,所以你不必担心z轴,谢谢)

1 个答案:

答案 0 :(得分:0)

所以,我已经使用了这篇文章提供的信息:

Determining if two rays intersect

朋友提供的信息可以解决这个问题。

第一篇文章指出,给定两个点(p1和p2)和两个方向向量(n1和n2),下列公式适用:

bool DoesRaysIntersects(Point p1, Point p2, Point n1, Point n2)
{
    float u = (p1.y * n2.x + n2.y * p2.x - p2.y * n2.x - n2.y * p1.x) / (n1.x * n2.y - n1.y * n2.x);
    float v = (p1.x + n1.x * u - p2.x) / n.x;

    return u > 0 && v > 0;
}

如果u和v都大于0,那是因为两条光线相撞。

如果它们碰撞,我们可以使用线的方程来提供碰撞点。我不知道这是否是实现它的最佳方式,但它对我有用:

首先,我们需要每条线的斜率。利用它们的斜率,我们可以计算每条线的y轴截距。通过这两个数据,我们可以计算出碰撞点:

Point GetPointOfIntersection(Point p1, Point p2, Point n1, Point n2)
{
    Point p1End = p1 + n1; // another point in line p1->n1
    Point p2End = p2 + n2; // another point in line p2->n2

    float m1 = (p1End.y - p1.y) / (p1End.x - p1.x); // slope of line p1->n1
    float m2 = (p2End.y - p2.y) / (p2End.x - p2.x); // slope of line p2->n2

    float b1 = p1.y - m1 * p1.x; // y-intercept of line p1->n1
    float b2 = p2.y - m2 * p2.x; // y-intercept of line p2->n2

    float px = (b2 - b1) / (m1 - m2); // collision x
    float py = m1 * px + b1; // collision y

    return new Point(px, py); // return statement
}

谢谢大家!