📜  C++中的点围绕另一个点的旋转

📅  最后修改于: 2021-05-30 02:51:56             🧑  作者: Mango

我们已经讨论了点1和点2中点P绕原点的旋转。点P沿逆时针方向绕原点的旋转角度为θ,如下所示:

Rotation of P about origin: P * polar(1.0, θ)

P绕点Q旋转

现在,我们必须旋转点P而不是围绕原点旋转,而绕一般点Q旋转。这可以通过平移方法轻松理解,平移方法是几何分析中非常普遍的技术。
什么是翻译?
在欧几里得几何学中,平移是一种几何变换,它使图形或空间的每个点在给定方向上移动相同的量。

如何进行翻译?
平移也可以解释为向每个点添加恒定向量,或解释为移动坐标系的原点。
翻译后,需要进行计算,并通过将常数矢量减去每个点或将原点向后移来使翻译无效。

坐标轴的平移

因此,为了使P绕Q旋转,我们在Q处移动原点,即从坐标平面的每个点减去Q的向量等效值。现在,新点P – Q必须绕原点旋转,然后平移必须无效。
这些步骤可以描述如下:

  1. 平移(在Q处移动原点):从所有点减去Q。因此,P变成P – Q
  2. (P – Q)绕原点的旋转: (P – Q)*极坐标(1.0,θ)
  3. 恢复原点:将Q添加到所有点。

因此,

Rotation of P about Q : (P – Q) * polar(1.0, θ) + Q
// CPP example to illustrate the rotation 
// of a point about another point
#include 
#include 
  
using namespace std;
  
typedef complex point;
#define x real()
#define y imag()
  
// Constant PI for providing angles in radians
#define PI 3.1415926535897932384626
  
// Function used to display X and Y coordinates of a point
void displayPoint(point P)
{
    cout << "(" << P.x << ", " << P.y << ")" << endl;
}
  
//Function for Rotation of P about Q by angle theta
point rotate(point P, point Q, double theta)
{
    return (P-Q) * polar(1.0, theta) +  Q;
}
  
int main()
{
    // Rotate P about Q
    point P(4.0, 3.0);
    point Q(2.0, 2.0);
  
    // Angle of rotation = 90 degrees
    double theta = PI/2;
      
    point P_rotated = rotate(P, Q, theta);
    cout << "The point P on rotating 90 degrees anti-clockwise about Q becomes:";
    cout << "P_rotated"; displayPoint(P_rotated);
  
    return 0;
}

输出:

The point P on rotating 90 degrees anti-clockwise about Q becomes: P_rotated(1, 4)