前言
已知坐标点为矩形内的某一个点,已知矩形的高和宽,旋转、平移参数也是已知的,求取矩形新的四个顶点的坐标。
一、旋转函数
// 旋转函数
Point rotatePoint(const Point& p, double angle) {
Point rotated;
rotated.x = p.x * std::cos(angle) - p.y * std::sin(angle);
rotated.y = p.x * std::sin(angle) + p.y * std::cos(angle);
return rotated;
}
通过旋转矩形计算旋转后的新坐标
二、计算旋转平移后的矩形顶点
void getTransformedRectangleVertices(double px, double py, double w, double h, double angle, double tx, double ty) {
// 矩形初始时的四个顶点相对于中心点的坐标
Point vertices[4] = {
{-w / 2, h / 2}, // 左上角
{w / 2, h / 2}, // 右上角
{w / 2, -h / 2}, // 右下角
{-w / 2, -h / 2} // 左下角
};
// 矩形中心点
double cx = px; // 已知点作为矩形中心点
double cy = py;
std::cout << "Transformed Vertices:\n";
for (int i = 0; i < 4; ++i) {
// 平移到原点
Point translated = { vertices[i].x + cx, vertices[i].y + cy };
// 旋转顶点
Point rotated = rotatePoint(translated, angle);
// 平移回去
rotated.x += tx;
rotated.y += ty;
std::cout << "Vertex " << i + 1 << ": (" << rotated.x << ", " << rotated.y << ")\n";
}
}
1、先计算四个顶点相对与原点的坐标
2、平移到矩形中的已知点
3、已知向量再次旋转、平移
三、测试代码
#include <iostream>
#include <cmath>
struct Point {
double x, y;
};
// 旋转函数
Point rotatePoint(const Point& p, double angle) {
Point rotated;
rotated.x = p.x * std::cos(angle) - p.y * std::sin(angle);
rotated.y = p.x * std::sin(angle) + p.y * std::cos(angle);
return rotated;
}
// 计算旋转和平移后的矩形顶点
void getTransformedRectangleVertices(double px, double py, double w, double h, double angle, double tx, double ty) {
// 矩形初始时的四个顶点相对于中心点的坐标
Point vertices[4] = {
{-w / 2, h / 2}, // 左上角
{w / 2, h / 2}, // 右上角
{w / 2, -h / 2}, // 右下角
{-w / 2, -h / 2} // 左下角
};
// 矩形中心点
double cx = px; // 已知点作为矩形中心点
double cy = py;
std::cout << "Transformed Vertices:\n";
for (int i = 0; i < 4; ++i) {
// 平移到原点
Point translated = { vertices[i].x + cx, vertices[i].y + cy };
// 旋转顶点
Point rotated = rotatePoint(translated, angle);
// 平移回去
rotated.x += tx;
rotated.y += ty;
std::cout << "Vertex " << i + 1 << ": (" << rotated.x << ", " << rotated.y << ")\n";
}
}
int main() {
// 已知点坐标(px, py),矩形的宽度w,高度h,旋转角度(弧度制),平移(tx, ty)
double px = 3, py = 2; // 已知点
double w = 4, h = 2; // 矩形宽度和高度
double angle = M_PI / 4; // 旋转 45 度
double tx = 1, ty = 2; // 平移向量
getTransformedRectangleVertices(px, py, w, h, angle, tx, ty);
return 0;
}