📜  旋转 2d d'un 点 - C++ (1)

📅  最后修改于: 2023-12-03 15:26:15.121000             🧑  作者: Mango

旋转 2D 的一个点 - C++

在计算机图形学中,旋转是一个常见的操作,其可以应用在2D和3D的图形处理中。在2D中,经常需要将一个点绕着另一个点进行旋转。本篇介绍如何使用C++实现在2D中旋转一个点。

问题描述

在2D平面上,给定一个点$(x,y)$和一个旋转角度$\theta$,要求计算旋转后该点的新坐标$(x',y')$。

旋转示意图

解决方案
1. 弧度制和角度制

在解决问题之前,我们需要先确定一下我们在后续计算中使用的是弧度制还是角度制。弧度制使用弧度作为单位,而角度制使用角度作为单位。弧度强调的是圆的弧长与圆的半径之比,而角度则强调的是圆心所夹的角度大小。在常规的计算中,我们常常使用弧度制,但如果实现中采用角度制,也需要对角度进行转化。

  • 角度制转换成弧度制:弧度数 = 角度数 × π ÷ 180
  • 弧度制转换成角度制:角度数 = 弧度数 × 180 ÷ π

在C++中,我们可以使用数学库中的pi来表示圆周率π。

const double pi = acos(-1.0); // 定义π为acos(-1),acos表示反余弦函数
2. 旋转矩阵

在笛卡尔坐标系中,对一个点$(x,y)$绕着原点旋转角度$\theta$可视为将坐标系绕着原点旋转角度$-\theta$后,再取点$(x,y)$的值,计算后再次将坐标系同样方式旋转回来。因此,我们可以分别计算坐标系逆时针旋转角度$\theta$和顺时针旋转角度$-\theta$后的坐标系对应的坐标,然后将点$(x,y)$的坐标值代入计算。

旋转矩阵

由上图得出矩阵:

$$ R_{\theta} = \begin{bmatrix} \cos(\theta) & -\sin(\theta) \ \sin(\theta) & \cos(\theta) \ \end{bmatrix} $$

其中,$\cos(\theta)$表示旋转角度为$\theta$的圆的$x$轴上的投影,$\sin(\theta)$表示旋转角度为$\theta$的圆的$y$轴上的投影。

计算逆时针旋转角度$\theta$后,一个点$(x,y)$的新坐标$(x',y')$为:

$$ \begin{bmatrix} x' \ y' \ \end{bmatrix}

\begin{bmatrix} \cos(\theta) & -\sin(\theta) \ \sin(\theta) & \cos(\theta) \ \end{bmatrix} \begin{bmatrix} x \ y \ \end{bmatrix} $$

3. 程序实现

根据上面的计算方式,我们可以写出C++代码:

/**
 * 旋转一个点
 * @param x, y: 欲旋转的点
 * @param rot: 旋转角度
 * @return vector<double>: 旋转后的点坐标(vector结构)
 */
vector<double> rotation(int x, int y, double rot){
    double rad = rot * pi / 180.0; // 转化为弧度制
    double x_new = x * cos(rad) - y * sin(rad);
    double y_new = x * sin(rad) + y * cos(rad);
    return {x_new, y_new}; // 新的点坐标,使用vector保存
}
总结

在计算机图形学中,旋转是一个常用的操作。本文介绍了如何在2D平面中通过C++语言实现一个点的旋转。主要思路是根据笛卡尔坐标系的逆时针旋转方式,通过矩阵计算出旋转后的新点坐标。这种方式也可以应用在其他的2D坐标系的转化。