2011-08-23 163 views
2

我想將舊圖形編輯器的旋轉和裁剪矩形設置轉換爲使用與舊座標系不同座標系的新編輯器。下圖說明了該問題:將座標轉換爲旋轉座標系

rectangles illustration

所有矩形具有相同的縱橫比(例如3:2),並且所有的座標被跨越邊緣歸一化(即,從0到1在X和Y方向)。

舊程序保存了與綠色矩形(原點在A)對齊的座標系中給出的藍色矩形C的角點座標以及黃色矩形的旋轉角度。

新程序需要座標系中藍色矩形的邊角與黃色矩形對齊(原點位於B)。我如何做從舊到新的轉變?

這看起來像是一個簡單的數學問題,但是從數學課程開始已經很多年了,我無法用筆和紙來解決這個問題,也沒有搜索這個網站(很多類似的問題,但我找不到相當匹配......)

+0

我沒有足夠清楚地描述已知變量。只有矩形C的座標和從X軸(全部在座標系A中)的旋轉角度是已知的。 B的座標未知。然而,已知A和B的縱橫比都相同,並且B是可以放入A內部的最大矩形。矩形C實際上可以位於矩形A內的任何位置,並且可以具有不同的縱橫比。 – JPK

+0

額外的約束,應該使B的計算更容易:矩形B在矩形A內居中。 – JPK

回答

2

c(0), c(1), c(2), c(3)成爲C的四個角,讓b(0)成爲B的座標系所在的轉角B.令q爲B的X軸的旋轉角度。所有這些角度和點必須在相同的座標系中給出。

要找到B中的c(i)的座標,請將矢量c(i) - b(0)旋轉角度q(或-q,具體取決於測量方式)。你可以使用這個旋轉矩陣。設cq = cos(q),sq = sin(q)(dx, dy) = c(i) - b(0)。的c(i) B中的座標然後

Product of the rotation matrix for q and (dx, dy)


c = (c(0) + c(2))/2是C的中心設S(s)是由s縮放矩陣,讓R(q)是由q旋轉矩陣。 B的角落由

b(i) = c + S(s) * R(q) * (c(i) - c) 

矩形A的角落a(0), a(1), a(2), a(3)也是已知的。我們希望確定縮放參數的最大可能值s,使得所有的點B的b(i)是矩形A.

我覺得這裏最安全,最簡單的方法是考慮有關對b(i)a(i)和這樣的內對計算最大值s(i, j),使得如果s = s(i, j)b(i)位於a(j)的拐角區域內。

a(0)讓和a(2)是A的相對的角,並讓c(0)c(1)是C的相鄰角讓r(j) = a(j) - cd(i) = R(q) * (c(i) - c)

每個對角線i可以通過

s(i, j) = min (|r(j).x|/|d(i).x|, |r(j).y|/|d(i).y|) 

之前乙通過r(j)限定的區域外移動時進行縮放。計算s(i, j)i = 0, 1j = 0, 2並且s爲這4個值中的最小值。


根據q如何衡量你可能需要一個轉換應用於q' = atan2(kx * sin(q), ky * cos(q))q佔的縱橫比的問題。

+0

不幸的是,這並不能解決整個問題,因爲b(0)是未知的(參見上面的註釋)。這仍然有幫助,因爲現在我明白這實際上是兩個獨立的問題,而你回答了後者。現在,我必須找出b(0)的座標,給出A和B的縱橫比約束,然後我可以使用你的公式來轉換任何類型的C. – JPK

+0

@JPK我已經添加了一個擴展的討論。 – antonakos

+0

你的答案似乎假定矩形C總是具有與A和B相同的縱橫比,但這並非總是如此。然而,用旋轉的A代替C,然後用你的算法找到s,我可以計算出b(i),之後我可以旋轉C的座標。非常感謝你的幫助! – JPK