2014-12-13 95 views
0

编辑观点:这不是一个重复,请阅读问题的描述给定两个点和两个方向矢量,发现在它们交叉

只是要清楚,这些线段不具有终点。它们从一个点开始,根据方向矢量进入无穷大。我找到了有限线段的解决方案,但它们不适用于这种特殊情况(我认为)。

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

  1. 点P1
  2. 点P2
  3. 方向矢量N1(单位向量)
  4. 方向矢量N2(一归一化的矢量)

第一条线段从p1开始并指向n1

第二线段开始于P2和对N2

点我需要两个答案:

  1. 如果他们相交和
  2. 有什么交集的

我点我找到了这两个答案,但是我数学很差,以至于我无法适应他们以适应我的问题,但它可以帮助你们,我希望。

How do you detect where two line segments intersect?

Given two points and two vectors, find point of intersection

非常感谢!

编辑:(顺便说一句,我在二维空间中工作,所以你不必担心Z轴,感谢)

+0

[给定两个点和两个向量,找到交点]的可能重复(http://stackoverflow.com/questions/14256525/given-two-points-and-two-vectors-find-point-of-交集) - 那里的答案告诉你如何做到这一点。 – 2014-12-13 13:08:15

+0

如果它们的渐变是不相等的,你将能够告诉它们相交。为了告诉_where_他们感兴趣,您需要解决'm1 * x + c1 = m2 * x + c2',其中'm是您的线的梯度,'c's是与'y'轴的交点。然后,您可以将'x'值插回到'm1 * x + c1 = y'中以得到'y'交点。 – Rich 2014-12-13 13:08:46

+0

伙计们,这条线的原始方程式在这里不起作用。我没有双向的无限线。只在一个方向。这不是一条线。这是一条线段。谢谢。 – 2014-12-13 15:18:18

回答

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 
} 

谢谢大家!

+0

它不适用于垂直和水平线,斜率= 0和斜率=无穷大 – uray 2018-01-29 04:31:28