【问题标题】:Function to rotate a point around another point围绕另一个点旋转一个点的功能
【发布时间】:2011-09-16 06:22:36
【问题描述】:

所以我在这里有一个数学函数,假设返回一个旋转的点,并取一个原点,指向旋转的点(原点)和弧度来旋转它。

但是它只以半速旋转(又名 180 度移动 = 90 度旋转)

sf::Vector2f RotatePoint(sf::Vector2f origin, sf::Vector2f point, float radian) {   
    float s = sin(radian);   
    float c = cos(radian);  

    // translate point back to origin:  
    point.x -= origin.x;   
    point.y -= origin.y;   

    // rotate point   
    float xnew = point.x * c - point.y * s;   
    float ynew = point.x * s + point.y * c; 

    // translate point back to global coords:
    sf::Vector2f TranslatedPoint;
    TranslatedPoint.x = xnew + origin.x;  
    TranslatedPoint.y = ynew + origin.y; 

    return TranslatedPoint;
} 

【问题讨论】:

  • 为什么要就地修改点参数?
  • 您的问题是什么?结果值是多少?
  • 您能否也发布您的调用代码以及预期和实际结果?我相信代码有效,您是否正确计算了弧度测量值?

标签: c++ algorithm function math rotation


【解决方案1】:

我觉得这个功能还可以。如果您想知道,旋转只是将向量乘以 2D 欧几里得旋转矩阵(http://en.wikipedia.org/wiki/Rotation_matrix)。我能想到的唯一错误是对函数用法的一些误解。例如。 2*PI 弧度 = 360 度,或者逆时针旋转。

【讨论】:

    【解决方案2】:

    您的代码看起来不错。我们同意 180° 的度数是弧度的 Pi 吗?

    【讨论】:

      【解决方案3】:

      功能很好。但是,您可能想重新学习一下线性代数:您基本上是在计算

      return rotation * (point - origin) + origin;
      

      旋转矩阵由对角线上的 cos(radian) 和非对角线上的 +/- sin(radian) 组成。因此,如果您让线性代数库计算该矩阵,则整个函数是单行的;如果你把 -origin 部分分解出来(记住,线性代数是线性的),它变成:

      return rotation * point + ( - rotation * origin + origin );
      

      第二部分是点不变的,可以预先计算。

      【讨论】:

      • "线性代数是线性的。"呵呵。
      猜你喜欢
      • 2012-11-21
      • 2014-12-26
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多