簡體   English   中英

在旋轉的矩形內找到一個點

[英]Find a point inside a rotated rectangle

好的,這應該超級簡單,但是我不是一個聰明人。 從技術上講,我想知道一個點是否位於矩形內,但是矩形可以處於不同的狀態。 在當前上下文中,當我想繪制一個順時針旋轉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的空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM