我有一堆对象(ActiveRecord),它们具有相对于HTML5画布元素的x和y坐标。我需要将它们旋转不同的度数(以90度为增量),然后再次存储它们以进行一次性数据迁移。这些对象都是相对于画布元素的,所以坐标从(0,0)开始,如果可能的话,我希望它们保持在该象限(右下角)。我假设我需要围绕(0,0)旋转,然后向下和向右平移。有没有一种方法可以写一个块来完成这个任务?
ddrv8njm1#
1.要绕原点将点 P 旋转 R 度,请执行以下操作:
citation(http://en.wikipedia.org/wiki/Rotation_(mathematics))1.您可能希望围绕放置对象的象限中心的任意点旋转。如果象限的宽度为200 x100单位,则需要围绕点<100,50>旋转。要围绕原点以外的位置 C 旋转点 P,首先要将该位置平移到原点,然后围绕原点旋转,然后平移回C。换句话说
<100,50>
您可以在http://phrogz.net/SVG/rotations.xhtml中看到这一操作-单击以设置旋转中心,或更改旋转量,并在平移到原点,旋转,然后再次平移回来的点组上设置变换。把这些放在一起,在Ruby中,要围绕任意点旋转具有x和y属性的点,可以使用如下代码:
x
y
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>]
1条答案
按热度按时间ddrv8njm1#
1.要绕原点将点 P 旋转 R 度,请执行以下操作:
citation(http://en.wikipedia.org/wiki/Rotation_(mathematics))
1.您可能希望围绕放置对象的象限中心的任意点旋转。如果象限的宽度为200 x100单位,则需要围绕点
<100,50>
旋转。要围绕原点以外的位置 C 旋转点 P,首先要将该位置平移到原点,然后围绕原点旋转,然后平移回C。换句话说
您可以在http://phrogz.net/SVG/rotations.xhtml中看到这一操作-单击以设置旋转中心,或更改旋转量,并在平移到原点,旋转,然后再次平移回来的点组上设置变换。
把这些放在一起,在Ruby中,要围绕任意点旋转具有
x
和y
属性的点,可以使用如下代码: