我有一堆對象(ActiveRecord),它們具有相對於HTML5 canvas元素的x和y座標。我需要以不同的度數(以90度遞增)旋轉它們的集合,然後再次存儲它們以進行一次數據遷移。旋轉一組對象座標
這些對象都是相對於canvas元素的,所以座標從(0,0)開始,如果可能的話,我希望它們留在那個象限內(右下角)。我假設我需要圍繞(0,0)進行旋轉,然後向下和向右進行翻譯。
有沒有一種方法可以編寫一個塊來做到這一點?任何幫助表示讚賞。
更新:做了一些編輯,使一些問題後更清楚。
謝謝。
我有一堆對象(ActiveRecord),它們具有相對於HTML5 canvas元素的x和y座標。我需要以不同的度數(以90度遞增)旋轉它們的集合,然後再次存儲它們以進行一次數據遷移。旋轉一組對象座標
這些對象都是相對於canvas元素的,所以座標從(0,0)開始,如果可能的話,我希望它們留在那個象限內(右下角)。我假設我需要圍繞(0,0)進行旋轉,然後向下和向右進行翻譯。
有沒有一種方法可以編寫一個塊來做到這一點?任何幫助表示讚賞。
更新:做了一些編輯,使一些問題後更清楚。
謝謝。
要旋轉點P- [R圍繞原點度的量:
P2.x = Px的 * COS(- [R) - PY * SIN( - [R)
P2.y = Px的 * SIN([R)+ PY * COS([R)
[citation]
你可能要繞在你保持在目標象限的中心的任意點。如果你的象限爲200x100單位寬,你想旋轉點<100,50>
。
要旋轉點P某個地點周圍ç比其他產地,你要的位置首先轉換到原點,然後繞原點旋轉,然後再轉換回C.換句話說,
P2 = P - ç
P3 =旋轉(P2)
P4 = P3 + Ç
您可以在http://phrogz.net/SVG/rotations.xhtml在行動中看到這一點 - 點擊設置旋轉中心,或改變旋轉量,並設置上轉化爲原點的組點的變換,旋轉,然後再翻譯回來。
把它放在一起,並與x
和y
屬性圍繞在Ruby中的任意點旋轉一個點,你會使用這樣的代碼:
Point = Struct.new(:x,:y) do
def self.to_proc
lambda{ |x| self.new *x }
end
def rotate(degrees, origin=Point.new(0,0))
radians = degrees * Math::PI/180
x2 = x-origin.x; y2 = y-origin.y
cos = Math.cos(radians); sin = Math.sin(radians)
self.class.new(
x2*cos - y2*sin + origin.x,
x2*sin + y2*cos + origin.y
)
end
def inspect
"<%.1f,%.1f>" % [x,y]
end
end
points = [ [0,0], [1,2], [3,4], [5,6] ].map(&Point)
p points
#=> [<0.0,0.0>, <1.0,2.0>, <3.0,4.0>, <5.0,6.0>]
p points.map{ |p| p.rotate(90) }
#=> [<0.0,0.0>, <-2.0,1.0>, <-4.0,3.0>, <-6.0,5.0>]
p points.map{ |p| p.rotate(90,Point.new(3,4)) }
#=> [<7.0,1.0>, <5.0,2.0>, <3.0,4.0>, <1.0,6.0>]
很好,謝謝! –
不知道我是否聽懂了沒有:你想添加90度或180度? 「留在那個象限」是什麼意思? – mkro
對不起,如果我不清楚。我想旋轉不同組的對象不同數量的度數(但通常以90度的倍數)。另外,當我說'象限'時,我的意思是HTML5畫布的正面x和y座標,它是右下角。最後,我假設我們可以圍繞原點旋轉,然後將它們移回到積極的畫布象限中,但我不確定。 –