Python 如何在矩形的周长中找到一个点?

Python 如何在矩形的周长中找到一个点?,python,math,coordinates,pygame,Python,Math,Coordinates,Pygame,我正在使用Python2.7和Pygame,但任何语言的答案都可以 我试着在一个矩形的周长中沿着向量找到一个给定的点。我知道向量以及矩形的中心、宽度和高度,但为了简单起见,中心可以是(0,0) 例如,我想在一个2宽6高的矩形的大致(0.7,0.7)向量后面,找到矩形周长上的点 我现在的工作就是工作;但必须有一种更好、更优雅的方法:我取矩形的高度和宽度之间更宽的值的长度,使用该值和0之间的每一个数字,对矩形的4条边中的每一条进行测试,看看它是否在其中 这是我专门为我的游戏使用的代码,一点也不通用:

我正在使用Python2.7和Pygame,但任何语言的答案都可以

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

例如,我想在一个2宽6高的矩形的大致
(0.7,0.7)
向量后面,找到矩形周长上的点

我现在的工作就是工作;但必须有一种更好、更优雅的方法:我取矩形的高度和宽度之间更宽的值的长度,使用该值和0之间的每一个数字,对矩形的4条边中的每一条进行测试,看看它是否在其中


这是我专门为我的游戏使用的代码,一点也不通用:

我将对右上象限的向量执行此操作,但将其推广到其他向量应该不难。你知道向量的角度和矩形的边长。所以

1) 确定向量是击中矩形的右侧还是顶部。通过构造一个直角三角形,其斜边是矩形的对角线,即从原点到上角的直线。如果向量的角度A大于该角度,它将到达顶部;否则它会撞到侧面

2) 假设它击中侧面(如果它击中顶部,解决方案将是类似的)。如果三角形的宽度为w,则可以构造一个直角三角形,其顶点为原点、点(w/2,0)和点(w/2,y),其中(w/2,y)是要查找的点。那就用这个来得到y


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

我将通过比较向量分量的比率来实现这一点,这也是平行于向量的直线的斜率,对于从矩形中心指向其角点的向量,设置为相同的数量。这将告诉您向量是击中水平面还是垂直面。之后,您可以使用简单的比例来找到交点

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

要在实践中使用此方法,您需要在
y*w
x*h
之间进行比较,以避免零除的问题,并避免相对昂贵的除法运算符(这并不是真正的区别)。此外,只需使用
x
y
的符号,就可以找到交点组件的正确符号。所以在代码中,它看起来像这样:

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
为零且
y
w
为零,则此操作将失败,但在这种情况下,您的矢量为零(且问题未定义)或矩形宽度为零(同样,问题未定义)。这样我就不用费心检查那个案例的错误了


如果矩形的中心点不是
(0,0)
,则只需将表示矩形中心的位置向量添加到该函数的结果中即可

谢谢你的链接,我没有使用这些术语,你的结果似乎更好,几乎让我的问题变得多余。再次感谢。若你们指的是我使用的,不,那个不是打字错误。我错了,我试了一些东西后,以为是打字错误;math.sign()、math.sgn()、sig()和sign()。进行了快速搜索,发现此页面对您的意思进行了很好的解释: