![](/img/trans.png)
[英]How to find Relative Offset of a point inside a non axis aligned box (box that is arbitrarily rotated)
[英]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.