我有一堆对象(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坐标,它是右下角。最后,我假设我们可以围绕原点旋转,然后将它们移回到积极的画布象限中,但我不确定。 –