给定2个点和直线 - 点与线相交? :algorithm / pseudocode

时间:2017-01-31 00:06:47

标签: algorithm geometry pseudocode points intersect

一位同事给了我这个问题来试验我的知识:

考虑两个点1和2,分别具有坐标(x1,y1)和(x2,y2)。在与这两个点相同的平面中,垂直线的顶部和底部分别由(xTop,yTop)和(xBot,yBot)表示。这两个点可以位于墙的相对侧,位于墙的同一侧,或者直接位于墙的上方/下方。为简单起见,这些点都不能直接在墙上。从第1点到第2点绘制一条线;如果墙上的交叉点(垂直线)发生,它将发生在点(xInt,yIint)。

给定两个点和一个墙,写一个算法来确定这两个点是否可以看到彼此。仅当从点1到点2绘制的线不接触墙时才会发生这种情况。

我正确地确定,如果两个点的x值都小于/大于墙壁的x值,它们可以看到彼此。 y值也是如此。我相信这个问题涉及很多几何。但是,我是一个老人,只是回到编程中寻找乐趣,这真的是让我理解。任何帮助都会非常感激。谢谢。

-Jon N。

2 个答案:

答案 0 :(得分:0)

线的等式是y = mx + b,其中m是斜率,b是y轴截距。

要确定两个点之间的线是否与另一个点(在您的情况下为垂直)线相交,请首先确定连接这两个点的线的斜率。

m =斜率=(上升/下降)=(y2 - y1)/(x2 - x1)

接下来,确定y轴截距。

给定(x1,y1)在线上,y = mx + b是线的等式,则y1 = mx1 + b。由于我们知道y1,x1和m,我们可以求解b。

b = y-intercept = y1 - mx1 = y1 - ((y2-y1)/(x2-x1))x1

现在,要确定线是否截取墙,只需将墙的x坐标放入连接两点的线的等式中,如果结果超出墙的y值范围,然后它不拦截墙(两点可以看到对方)。

Y @ wall = mxbot + b

如果YBot< = Y @ wall< = YTop,则墙在两点之间。

希望这能帮到你!

答案 1 :(得分:0)

与许多几何算法一样,有许多特殊情况。我们做一张桌子吧。 L表示墙的左侧,A表示上方,B表示下方,R表示正确。 Y表示是,?表示可能,n表示否(存在交叉点)。

  L A B R
L n n n ?
A n n Y n
B n Y n n
R ? n n n

当一个点在左边而另一个在右边时,我们计算与包含墙的线的交点,并检查它是否在墙上。

代码:

def intersects(x1, y1, x2, y2, wallx, wallymin, wallymax):
    if (x1 < wallx and x2 > wallx) or (x1 > wallx and x2 < wallx):
        iy = ((x2 - wallx) * y1 + (wallx - x1) * y2) / (x2 - x1)
        return iy >= wallymin and iy <= wallymax
    elif x1 == wallx and x2 == wallx:
        return (y1 < wallymin and y2 > wallymax) or (y1 > wallymax and y2 > wallymin)
    else:
        return False