Ruby 旋转一组对象坐标

Ruby 旋转一组对象坐标,ruby,geometry,rotation,Ruby,Geometry,Rotation,我有一堆对象(ActiveRecord),它们具有相对于HTML5画布元素的x和y坐标。我需要将它们的集合旋转不同的度数(以90度为增量),然后再次存储它们以进行一次性数据迁移 这些对象都是相对于画布元素的,所以坐标从(0,0)开始,如果可能的话,我希望它们保持在该象限(右下角)。我假设我需要围绕(0,0)旋转,然后向下和向右平移 有没有一种方法可以让我写一个块来实现这一点?感谢您的帮助 更新:在一些问题之后进行了一些编辑以使其更清晰 谢谢 将点p绕原点旋转R度: P2.x=P.x*cos(R)

我有一堆对象(ActiveRecord),它们具有相对于HTML5画布元素的x和y坐标。我需要将它们的集合旋转不同的度数(以90度为增量),然后再次存储它们以进行一次性数据迁移

这些对象都是相对于画布元素的,所以坐标从(0,0)开始,如果可能的话,我希望它们保持在该象限(右下角)。我假设我需要围绕(0,0)旋转,然后向下和向右平移

有没有一种方法可以让我写一个块来实现这一点?感谢您的帮助

更新:在一些问题之后进行了一些编辑以使其更清晰

谢谢

  • 将点p绕原点旋转R度:
    P2.x=P.x*cos(R)-P.y*sin(R)
    P2.y=P.x*sin(R)+P.y*cos(R)

  • 您可能希望围绕要保留对象的象限中心的任意点旋转。如果象限宽度为200x100个单位,则需要围绕点旋转

    要围绕原点以外的位置C旋转点p,首先要将该位置平移到原点,然后围绕原点旋转,然后再平移回C。换句话说,
    P2=P-C
    P3=旋转(P2)
    P4=P3+C

    您可以在单击以设置旋转中心或更改旋转量时看到这一点,并在平移到原点、旋转然后再次平移回原点的点组上设置变换

  • 把它们放在一起,在Ruby中围绕任意点旋转具有
    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>]
    
    Point=Struct.new(:x,:y)do
    def self.to_proc
    lambda{x|self.new*x}
    结束
    def旋转(度,原点=点。新(0,0))
    弧度=度*数学::π/180
    x2=x-原点x;y2=y原点。y
    cos=数学cos(弧度);sin=数学sin(弧度)
    新的(
    x2*cos-y2*sin+origin.x,
    x2*sin+y2*cos+origin.y
    )
    结束
    def检查
    “%[x,y]
    结束
    结束
    点=[[0,0],[1,2],[3,4],[5,6]]。地图(&点)
    p点
    #=> [, , ]
    p点映射{| p | p.rotate(90)}
    #=> [, , ]
    p点.map{| p | p.rotate(90,Point.new(3,4))}
    #=> [, , ]
    
    我还不确定我是否理解:您想增加90度还是180度?你说的“呆在那个象限”是什么意思?对不起,我不清楚。我想将不同的对象集旋转不同的度数(但通常是90度的倍数)。另外,当我说“象限”时,我指的是HTML5画布的正x和y坐标,即右下角。最后,我假设我们可以围绕原点旋转,然后将它们移回正画布象限,但我不确定。