推 jeep168917 : 太感謝您了! 11/11 06:43
※ 引述《jeep168917 (幫幫)》之銘言:
: 原始座標A(0,0),B(100,0),C(0,100)
: 經過旋轉90度、放大2倍、平移10
: 新座標變成A’(10,10), B’(10,210), C’(-190,10)
: 已知旋轉角度theta = 90°, 放大T=2, 平移S=10
: 利用二維矩陣可以算出經過旋轉、放大、平移後的座標(X’,Y’)
: X’= T*x*cos(theta) - T*y*sin(theta)+S
: Y’= T*x*sin(theta) - T*y*cos(theta)+S
: 問題來了,若已知原始座標(x,y)與新座標(X’,Y’)
: 該如何反推求出theta、T、S呢?
如果固定都是三個點轉換到三個點,
你可以把三個點視為一個三角形。
而且經過「旋轉」、「放大」、「平移」後,只有放大會改變邊長。
--
於是你可以利用向量 AB, AC 和轉換後的 A'B', A'C' 之間的長度比
得到伸長的比例
T = |A'B'| / |AB| = |A'C'| / |AC| (擇一)
--
再來,旋轉影響了向量的方向,你可以用你上面的算式算出兩組向量的旋轉角度。
以你的例子來說,
AB = (100, 0), AC = (0, 100); A'B' = (0, 200), A'C' = (-200, 0).
單位向量(因為只考慮角度)
u1 = (1, 0), u2 = (0, 1); u'1 = (0, 1), u'2 = (-1, 0)
所以變成解下面兩式(同樣擇一)
┌ ┐ ┌ ┐┌ ┐ ┌ ┐ ┌ ┐┌ ┐
│0│ │cosθ -sinθ││1│ │-1│ │cosθ -sinθ││0│
│ │ = │ ││ │, or │ │ = │ ││ │.
│1│ │sinθ cosθ││0│ │ 0│ │sinθ cosθ││1│
└ ┘ └ ┘└ ┘ └ ┘ └ ┘└ ┘
或者我提供另一個方法,直接把單位向量用極坐標表示:
u1 = (cos 0º, sin 0º), u2 = (cos 90º, sin 90º),
u1'= (cos 90º, sin 90º), u2'= (cos 180º, sin 180º).
所以可以得知旋轉的角度θ.
如果是寫程式,可以考慮 tanθ=x/y, 由差角公式得到 tan(T),
就可以用 arctan 求得 T。
--
最後,再把原本的點 x, y 經過 T, θ 的變換後的點,與 X', Y' 相減,
只需要高中所學的數學就能得到你要的 S (和 T, θ 了)。
以上,半夜打字,有錯請大家直接推文指正><
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.228.146.173
※ 文章網址: https://www.ptt.cc/bbs/Math/M.1510084792.A.B3A.html