线段起终点根据某一点旋转计算公式代码实现C++
时间: 2024-11-15 22:27:31 浏览: 18
在线段旋转的问题中,我们需要确定一个起点、一个终点以及旋转中心点后的新线段端点坐标。假设原线段AB的坐标是A(x1, y1)和B(x2, y2),旋转中心C的坐标是C(cx, cy),角度是以C为中心的逆时针旋转角度θ。
在二维空间中,旋转可以用旋转变换矩阵来表示,该矩阵由旋转中心C和旋转角θ决定。旋转后的新坐标可以通过下面的步骤计算:
1. 计算旋转矩阵R(θ):
```
R = [[cos(θ), -sin(θ)],
[sin(θ), cos(θ)]]
```
2. 对每个点应用旋转矩阵:
对于点A,先向量表示为(Ax-Ac, Ay Ac),其中Ac = (cx, cy)是旋转中心:
```
A_rotated = R * [(Ax - Ac), (Ay - Ac)] + Ac
```
同理对点B做同样的操作得到B_rotated。
下面是C++代码实现:
```cpp
#include <cmath>
#include <complex>
// 定义旋转矩阵
std::complex<double> rotationMatrix(double theta) {
double costheta = std::cos(theta);
double sintheta = std::sin(theta);
return std::complex<double>(costheta, -sintheta);
}
// 线段旋转函数
void rotateLineSegment(std::pair<double, double> A, std::pair<double, double> B,
std::pair<double, double> C, double theta, std::pair<double, double>& rotated_A,
std::pair<double, double>& rotated_B) {
// 转换到笛卡尔坐标系
std::complex<double> ac(C.first, C.second), a(A.first - C.first, A.second - C.second),
b(B.first - C.first, B.second - C.second);
// 应用旋转矩阵
std::complex<double> ra = rotationMatrix(theta) * (a) + ac;
std::complex<double> rb = rotationMatrix(theta) * (b) + ac;
// 取实数部分作为新坐标
rotated_A = {ra.real(), ra.imag()};
rotated_B = {rb.real(), rb.imag()};
}
// 示例
int main() {
std::pair<double, double> A{0, 0}, B{1, 1};
std::pair<double, double> C{1, 0}; // 旋转中心
double theta = M_PI / 4; // 45度旋转
std::pair<double, double> rotated_A, rotated_B;
rotateLineSegment(A, B, C, theta, rotated_A, rotated_B);
std::cout << "原线段AB: (" << A.first << ", " << A.second << ") -> (" << B.first << ", " << B.second << ")"
<< "\n旋转后新线段: (" << rotated_A.first << ", " << rotated_A.second << ") -> (" << rotated_B.first << ", "
<< rotated_B.second << ")";
return 0;
}
```
阅读全文