我正在使用Python 2.7和Pygame,但任何语言答案都可以。
我试图在矩形的周边找到沿着矢量的给定点。我知道矢量,矩形的中心,宽度和高度,但为了简单起见,中心可以是(0, 0)
因此,例如,我想找到矩形周长中的点,该点位于2宽6高的矩形的大致(0.7, 0.7)
向量之后。
我现在所做的工作是做的;但是必须有一个更好,更优雅的方式:我在矩形的高度和宽度之间取较宽的值,并使用0和0之间的每个数字,然后测试它的四个边中的每个边。矩形并查看它是否在其中。
这是我用于游戏的代码,根本没有概括:http://pastebin.com/8Ai1iQeL
答案 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*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)
以外的点,则只需将表示矩形中心的位置矢量添加到该函数的结果中。