一位同事给了我这个问题来试验我的知识:
考虑两个点1和2,分别具有坐标(x1,y1)和(x2,y2)。在与这两个点相同的平面中,垂直线的顶部和底部分别由(xTop,yTop)和(xBot,yBot)表示。这两个点可以位于墙的相对侧,位于墙的同一侧,或者直接位于墙的上方/下方。为简单起见,这些点都不能直接在墙上。从第1点到第2点绘制一条线;如果墙上的交叉点(垂直线)发生,它将发生在点(xInt,yIint)。
给定两个点和一个墙,写一个算法来确定这两个点是否可以看到彼此。仅当从点1到点2绘制的线不接触墙时才会发生这种情况。
我正确地确定,如果两个点的x值都小于/大于墙壁的x值,它们可以看到彼此。 y值也是如此。我相信这个问题涉及很多几何。但是,我是一个老人,只是回到编程中寻找乐趣,这真的是让我理解。任何帮助都会非常感激。谢谢。
-Jon N。
答案 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