已知矩形中的任意一点坐标旋转、平移后新的矩形顶点坐标

前言

已知坐标点为矩形内的某一个点,已知矩形的高和宽,旋转、平移参数也是已知的,求取矩形新的四个顶点的坐标。

一、旋转函数

// 旋转函数
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值