【问题标题】:C++: Rotating a vector around a certain pointC ++:围绕某个点旋转矢量
【发布时间】:2010-10-11 20:50:07
【问题描述】:

我正在尝试围绕向量上的某个点旋转向量(在 C++ 中):

1 2 3
4 5 6
7 8 9

围绕点 (1,1)(即“5”)旋转 90 度会导致:

7 4 1
8 5 2
9 6 3

我现在正在使用:

x = (x * cos(90)) - (y * sin(90))
y = (y * cos(90)) + (x * sin(90))

但我不希望它围绕 (0,0) 旋转

【问题讨论】:

  • 发布一些 C++ 代码来说明您正在尝试做什么。

标签: c++ vector rotation


【解决方案1】:

答案取决于您的坐标系。

计算机图形坐标系,(0,0)顶部左侧

如果您使用计算机图形矢量实现,其中(0,0)顶部 左角并且您围绕点(dx, dy) 旋转,那么旋转计算,包括转换回原始坐标系,将是:

x_rotated =      ((x - dx) * cos(angle)) - ((dy - y) * sin(angle)) + dx
y_rotated = dy - ((dy - y) * cos(angle)) + ((x - dx) * sin(angle))

物理/数学坐标系,(0,0)底部左侧

如果您使用的是更传统的现实世界坐标系,其中(0,0)底部左角,则围绕点(dx, dy) 进行旋转计算,包括平移回原来的位置坐标系,应该是:

x_rotated = ((x - dx) * cos(angle)) - ((y - dy) * sin(angle)) + dx
y_rotated = ((x - dx) * sin(angle)) + ((y - dy) * cos(angle)) + dy

感谢 mmxPesto 的帖子发表评论,感谢 SkeletorFromEterenia 突出显示我的实现中的错误。

【讨论】:

    【解决方案2】:

    解决方法是将向量平移到旋转中心为(0,0)的坐标系。应用旋转矩阵并将向量转换回原始坐标系。

    dx = x of rotation center  
    dy = y of rotation center
    
    V2 = V - [dx, dy, 0]  
    V3 = V2 * rotation matrix  
    Result = V3 + [dx, dy, 0]
    

    【讨论】:

      【解决方案3】:

      假设您使用的是标准向量实现,其中 (0,0) 将是左上角并且您围绕点 (x_origin, y_origin) 旋转,应该这样做:

      x = ((x - x_origin) * cos(angle)) - ((y_origin - y) * sin(angle))
      y = ((y_origin - y) * cos(angle)) - ((x - x_origin) * sin(angle))
      

      请注意,y 是 y_origin - y,因为 y 值会随着您下降而增加。

      【讨论】:

      • 您需要在转换后将其翻译回来。结果 (x, y) 不在原始坐标系中。
      【解决方案4】:

      我发现 Mark Booth 的答案是错误的(将 (0,1,0) 旋转 0 度,用他的公式得到 (0,-1,0)),我最终得到:

      double cs = cos_deg(new_degrees);
      double sn = sin_deg(new_degrees);
      
      double translated_x = x - x_origin;
      double translated_y = y - y_origin;
          
      double result_x = translated_x * cs - translated_y * sn;
      double result_y = translated_x * sn + translated_y * cs;
          
      result_x += x_origin;
      result_y += y_origin;
      

      当然可以进一步缩短,但我想让它尽可能简单。

      【讨论】:

      • 感谢您指出错误,我现在更新了my answer 并进行了修复,并详细说明了您使用的坐标系意味着您需要与Pesto 提出的不同的解决方案.
      【解决方案5】:

      您需要使用translation matrix 来围绕不同的点移动旋转。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-23
        • 1970-01-01
        • 1970-01-01
        • 2022-09-26
        • 2023-04-03
        相关资源
        最近更新 更多