在旋转矩形内查找一个点

Find a point inside a rotated rectangle

本文关键字:一个 查找 旋转      更新时间:2023-10-16

好吧,这应该非常简单,但我不是一个聪明人。 从技术上讲,我想知道一个点是否位于矩形内,但是矩形可以处于不同的状态。在我当前的上下文中,当我想绘制一个顺时针旋转 45° 的矩形时,我所做的是将整个 x,y 轴旋转到矩形的左上角中心,然后我只是绘制矩形,就好像什么都没发生过一样。如果我想在随机坐标上绘制矩形,也是如此。鉴于这是被抛掷和旋转的坐标系,矩形总是认为它是在 (0,0) 处以 0° 绘制的,因此,查找给定点是否在矩形内的最佳方法是根据矩形的平移 + 旋转找到该点的投影。但我不知道该怎么做。

这是我目前所做的,以确定一个点是否在矩形内(不考虑旋转):

bool Image::isPointInsideRectangle(int x, int y, const ofRectangle & rectangle){
    return x - xOffset >= rectangle.getX() && x - xOffset <= rectangle.getX() + rectangle.getWidth() &&
            y - yOffset >= rectangle.getY() && y - yOffset <= rectangle.getY() + rectangle.getHeight();
}

我已经存储了angleInDegrees,只要我能用它来投影我收到的 (x,y) 点,我应该能够找出该点是否在矩形内。

干杯!

阿克塞尔

最简单的方法是相对于矩形的原点和旋转以相反的方向取消旋转 x,y。

例如,如果 angleInDegrees 为 45 度,则可以旋转该点以测试 -45 度(如果旋转例程仅允许正旋转,则旋转 315 度)。 这将在与未旋转的矩形相同的坐标系上绘制 x,y。

然后,您可以使用已经提供的函数来测试该点是否在矩形内。

请注意,在旋转 x,y 之前,您可能需要相对于旋转点(矩形的左上角)调整 x,y。 由于旋转是相对于该点而不是整体坐标原点 0,0。 您可以计算 x,y 与矩形左上角之间的差值(在旋转过程中不会更改),然后只需按 -angleToRotate 旋转调整后的点,然后将原点差添加回未旋转的点即可获得坐标系上的绝对坐标。

已编辑:

#include <cmath>
bool Image::isPointInsideRectangle(int x, int y, const ofRectangle & rectangle){
    return x*cosd(deg) - y*sin(deg) + xOffset >= rectangle.getX()
        && x*cosd(deg) - y*sin(deg) + xOffset <= rectangle.getX() + rectangle.getWidth() 
        && x*sind(deg) + y*cosd(deg) + yOffset >= rectangle.getY()
        && x*sind(deg) + y*cosd(deg) + yOffset <= rectangle.getY() + rectangle.getHeight();

就像你已经说过的,你可以将点的坐标转换为矩形的空间。这是许多使用几何图形的软件产品中的常见任务。每个对象都有自己的坐标空间,并且无需旋转即可在位置 (0, 0) 处工作。如果您的矩形位于位置 v 并旋转约 b 度/弧度,则可以使用以下公式将点 P 转换为矩形的空间:

| cos(-b)  -sin(-b) |   | P_x - v_x |
|                   | ⋅ |           |
| sin(-b)   cos(-b) |   | P_y - v_y |

许多最重要的变换都可以表示为矩阵。至少如果您使用的是均匀坐标。这样做也很常见。根据程序的复杂性和目标,您可以考虑使用一些数学库,如glm,并以矩阵的形式使用对象的转换。然后你可以写一些类似inverse(rectangle.transformation()) * point的东西,point翻译成rectangle的空间。

相关文章: