繁体   English   中英

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

[英]How to find a point in the perimeter of a rectangle?

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

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

因此,例如,我想在矩形的周长中找到一个点,该点遵循2乘以6的高度的矩形的大约(0.7, 0.7)向量。

我现在正在做的工作已经完成; 但是必须有一种更好,更优雅的方法:我采用矩形的高度和宽度之间较宽的值的长度,并使用介于0和0之间的每个数字,并针对矩形的4个边分别进行测试。矩形,看看是否在其中。

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

我将对右上象限中的向量执行此操作,但是将其推广到其他区域并不难。 您知道矢量的角度和矩形的边长。 所以

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

2)假设它碰到侧面(如果碰到顶部,解决方案将类似)。 如果三角形的宽度为w,则可以构造一个直角三角形,其顶点为原点,点(w / 2,0)和点(w / 2,y),其中(w / 2,y )是您要查找的点。 然后只要使用罪孽定律就可以得到y。

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

为此,我将比较矢量分量的比率(也就是平行于矢量的直线的斜率)与从矩形中心到其角点的矢量的相同比例。 告诉您矢量是水平还是垂直。 之后,您可以使用简单的比例关系找到交点。

假设您的向量为(x,y) ,并且目前假设两个坐标均为正。 使用矩形中心为(0,0)的坐标系,斜率为y/x ,矩形的等效量为h/w 现在,如果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)以外的其他点,则只需将代表矩形中心的位置矢量添加到该函数的结果中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM