MarkusQ概述的方法非常有效,但請記住,如果已經有A點,則不需要轉換其他三個角。
另一種更有效的方法是測試旋轉角度所在的象限,然后直接計算答案。這樣做效率更高,因為你只有兩個if語句的最壞情況(檢查角度),而另一個方法的最差情況是12個(當檢查其他三個角以查看它們是否大于當前時,每個組件為6個)我認為最大或小于當前最小值。
基本算法僅使用了畢達哥拉斯定理的一系列應用,如下所示。我用theta表示了旋轉角度,并以度為單位表示檢查,因為它是偽代碼。
ct = cos( theta );st = sin( theta );hct = h * ct;wct = w * ct;hst = h * st;wst = w * st;if ( theta > 0 ){
if ( theta < 90 )
{
// 0 < theta < 90
y_min = A_y;
y_max = A_y + hct + wst;
x_min = A_x - hst;
x_max = A_x + wct;
}
else
{
// 90 <= theta <= 180
y_min = A_y + hct;
y_max = A_y + wst;
x_min = A_x - hst + wct;
x_max = A_x;
}}else{
if ( theta > -90 )
{
// -90 < theta <= 0
y_min = A_y + wst;
y_max = A_y + hct;
x_min = A_x;
x_max = A_x + wct - hst;
}
else
{
// -180 <= theta <= -90
y_min = A_y + wst + hct;
y_max = A_y;
x_min = A_x + wct;
x_max = A_x - hst;
}}
這種方法假設你擁有你所說的你所擁有的東西,即A點和theta的值,它位于[-180,180]的范圍內。我還假設theta在順時針方向上增加,因為在圖中旋轉了30度的矩形似乎表明你正在使用,我不確定右邊的部分試圖表示什么。如果這是錯誤的方法,那么只需交換對稱子句以及st術語的符號。