在旋转的矩形内找到一个点

时间:2016-03-06 00:24:04

标签: c++

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

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

angleInDegrees

我已经存储了{{1}},只要我可以使用它来投射我收到的(x,y)点,我应该能够找出该点是否在矩形内。

干杯!

阿克塞尔

3 个答案:

答案 0 :(得分:1)

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

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

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

请注意,在旋转x,y之前,您可能需要相对于旋转点调整x,y - 矩形的左上角。由于旋转是相对于该点而不是整个坐标原点0,0。您可以计算x,y和矩形左上角之间的差异(在旋转期间不会发生变化),然后只需将调整后的点旋转-angleToRotate,然后将原点差异添加回未旋转的指向坐标系上的绝对坐标。

答案 1 :(得分:0)

Editted:

#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();

答案 2 :(得分:0)

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

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

许多最重要的transformations可以表示为矩阵。至少如果您使用的是homogeneous coordinates。这样做也很常见。根据程序的复杂性和目标,您可以考虑使用像glm这样的数学库,并以矩阵的形式使用对象的变换。然后你可以写inverse(rectangle.transformation()) * point之类的内容,将point翻译成rectangle的空格。