如何在矩形的周边找到一个点?

时间:2012-02-24 03:47:24

标签: python math coordinates pygame

我正在使用Python 2.7和Pygame,但任何语言答案都可以。

我试图在矩形的周边找到沿着矢量的给定点。我知道矢量,矩形的中心,宽度和高度,但为了简单起见,中心可以是(0, 0)

因此,例如,我想找到矩形周长中的点,该点位于2宽6高的矩形的大致(0.7, 0.7)向量之后。

我现在所做的工作是做的;但是必须有一个更好,更优雅的方式:我在矩形的高度和宽度之间取较宽的值,并使用0和0之间的每个数字,然后测试它的四个边中的每个边。矩形并查看它是否在其中。

这是我用于游戏的代码,根本没有概括:http://pastebin.com/8Ai1iQeL

2 个答案:

答案 0 :(得分:1)

我要对右上象限中的矢量执行此操作,但不应将其概括为其他符号。您知道矢量的角度和矩形的边长。所以

1)确定矢量是否会击中矩形的右侧或顶部。通过构造直角三角形来实现这一点,该三角形的斜边是矩形的对角线,即从原点到上角的直线。如果矢量的角度A大于该角度,它将击中顶部;否则它会碰到一边。

2)假设它击中一侧(如果击中顶部,解决方案将是类似的)。如果三角形的宽度为w,那么你可以构造一个直角三角形,其顶点是原点,点(w / 2,0)和点(w / 2,y),其中(w / 2,y) )是你想要找到的点。然后只需使用law of sines即可获得y。

正如所写,这个解决方案涉及一些分支(4 x 2)以涵盖所有可能性,但我敢打赌,如果你通过它,你可以找到消除代码重复的方法。例如,在开始时,您可以将每个矢量旋转到右上象限,然后在求解后使用旋转来重建点的正确位置。

答案 1 :(得分:1)

我将通过比较矢量分量的比率(也就是平行于矢量的线的斜率)与从矩形中心到其角点的矢量的相同数量进行比较。这会告诉您矢量是在水平方向还是在垂直方向。之后,您可以使用简单的比例来查找交叉点。

假设您的向量是(x,y),并且暂时假设两个坐标都是正数。斜率为y/x,矩形的等效数量为h/w,使用矩形中心位于(0,0)的坐标系。现在,如果y/x > h/w,您的交叉点将位于顶部边缘,因此您知道它的高度为h / 2。然后,您可以将坐标计算为(0.5*h*x/y,0.5*h)。如果y/x < h/w,则交叉点位于右边缘,坐标为(0.5*w,0.5*w*y/x)

要在实践中使用它,您需要实际进行y*wx*h之间的比较,以避免出现除零问题并避免相对昂贵的除法运算符(不是这确实有很大的不同)。此外,只需使用xy的符号,即可找到交叉点组件的正确符号。所以在代码中,它看起来像这样:

def intersect_perimeter(x, y, w, h):
    if abs(y*w) > abs(x*h):
        return (0.5*h*x/abs(y), 0.5*h*sign(y))
    else:
        return (0.5*w*sign(x), 0.5*w*y/abs(x))

(未测试)。如果x为零并且yw为零,则会失败,但在这种情况下,您有零向量(并且问题未定义)或零宽度矩形(再次,问题是未定义的)。所以我不打算为这种情况进行错误检查。

如果矩形居中于(0,0)以外的点,则只需将表示矩形中心的位置矢量添加到该函数的结果中。