二维坐标系的转换

二维坐标系的变换分为旋转变换和平移变换。

一、旋转变换

假设已知基坐标系XOY中的一点P(x,y),坐标原点为O,绕点O旋转θ,可以求得点P在新坐标系X'OY'中坐标值(x',y'),如下图所示:

求解x'和y'的关键是坚持用已知的边做斜边来求解,结合上图利用三角函数可以求得:

x'=x·cos(θ)+y·sin(θ)

y'=y·cos(θ)-x·sin(θ)

那么点P在X'OY'中的坐标值为(x',y')。

同理如果知道P点在坐标系X'OY'中的坐标(x',y'),可以求得点P在基坐标系XOY中的坐标值:

x=x'·cos(-θ)+y'·sin(-θ)

y=y'·cos(-θ)-x'·sin(-θ)

 

通过上述两个算式可以知道:已知一个点P在一个坐标系中的坐标值(x,y),那么把坐标系绕坐标原点旋转θ以后,点P在新坐标系中的坐标值x'和y'分别为:

x'=x·cos(θ)+y·sin(θ)

y'=y·cos(θ)-x·sin(θ)

绕坐标原点逆时针旋转θ,上式θ值为正,顺时针旋转θ,上式θ值为负。

二、平移变换

已知基坐标系XOY,把坐标系平移(a,b)得到一个新的坐标系X'O'Y',如果基坐标系中一点P(x,y),跟随坐标系一起平移,那么此时P点在基坐标系XOY中的坐标为(x+a,y+b)。

根据向量加法可以求得:

OP=OO'+O'P'=T+O'P'

所以向量OP'的坐标为(x+a,y+b)。

三、旋转平移变换

旋转平移变换是以上两种情况的叠加,已知旋转平移后的坐标系X'O'Y'中的一点P'(x',y'),求P'在基坐标系中的坐标值:

 

可以先求出P'在坐标系XO'Y中的坐标值,X'O'Y'顺时针旋转θ(此时θ应取负值)可以变换为坐标系XO'Y,然后坐标系XO'Y经过平移(-a,-b)可以变换为坐标系XOY,至此可以求出坐标系X'O'Y'中的一点P'(x',y')在基坐标系XOY中的坐标值x,y分别为:

x=x'·cos(θ)+y'·sin(θ)+a

y=y'·cos(θ)-x'·sin(θ)+b

 

原文地址:https://www.cnblogs.com/softhal/p/5648463.html

在C++中实现二维坐标系转换,通常涉及两个关键操作:平移和旋转。假设有一个点 $(x, y)$ 在原始坐标系 $XOY$ 中的坐标,而目标坐标系 $X'O'Y'$ 相对于原坐标系进行了平移 $(x\_shift, y\_shift)$ 和旋转 $angle$(单位为弧度),则该点在新坐标系中的坐标 $(x', y')$ 可以通过以下公式计算: $$ \begin{aligned} x' &= (x - x\_shift) \cdot \cos(angle) + (y - y\_shift) \cdot \sin(angle) \\ y' &= -(x - x\_shift) \cdot \sin(angle) + (y - y\_shift) \cdot \cos(angle) \end{aligned} $$ 下面是一个使用 C++11 标准实现的示例代码: ```cpp #include <iostream> #include <cmath> struct Point { double x; double y; }; Point transformCoordinate(const Point& original, double x_shift, double y_shift, double angle) { Point transformed; double cos_angle = std::cos(angle); double sin_angle = std::sin(angle); double x_translated = original.x - x_shift; double y_translated = original.y - y_shift; transformed.x = x_translated * cos_angle + y_translated * sin_angle; transformed.y = -x_translated * sin_angle + y_translated * cos_angle; return transformed; } int main() { Point p = {10.0, 5.0}; double x_shift = 2.0; double y_shift = 1.0; double angle = M_PI / 4; // 45 degrees in radians Point result = transformCoordinate(p, x_shift, y_shift, angle); std::cout << "Transformed coordinates: (" << result.x << ", " << result.y << ")" << std::endl; return 0; } ``` 在上述代码中: - `transformCoordinate` 函数用于执行坐标变换。 - `x_shift` 和 `y_shift` 表示目标坐标系相对于原坐标系的平移量。 - `angle` 表示旋转角度,单位为弧度。 - 通过三角函数 `std::cos` 和 `std::sin` 实现旋转操作。 - 平移和旋转的顺序是:先平移,再旋转。 此方法可以扩展为处理多个点的批量转换,也可以封装为类或模板函数,以适应更复杂的工程需求。 ### 三维坐标转换二维的扩展 如果需要将三维坐标 $(x, y, z)$ 映射到二维屏幕坐标,可以结合透视投影的方法。已知公式: $$ \begin{aligned} ratio &= \frac{d}{d + z} \\ x_1 &= ratio \cdot x \\ y_1 &= ratio \cdot y \end{aligned} $$ 其中 $d$ 是投影平面到观察点的距离。这一过程可以用于图形渲染中将三维空间中的点映射到二维屏幕上。 ### 示例代码:三维到二维的映射 ```cpp struct Point3D { double x; double y; double z; }; struct Point2D { double x; double y; }; Point2D projectTo2D(const Point3D& p, double d) { double ratio = d / (d + p.z); Point2D result; result.x = ratio * p.x; result.y = ratio * p.y; return result; } int main() { Point3D p3d = {10.0, 5.0, 3.0}; double d = 5.0; // 投影平面距离 Point2D p2d = projectTo2D(p3d, d); std::cout << "Projected 2D coordinates: (" << p2d.x << ", " << p2d.y << ")" << std::endl; return 0; } ``` 在该代码中: - `projectTo2D` 函数实现了三维到二维的投影转换。 - 参数 `d` 可根据具体应用场景进行调整。 ### 总结 二维坐标系转换可以通过平移和旋转实现,C++11 提供了必要的数学函数来支持这些操作。对于三维到二维转换,可以使用透视投影的原理进行实现。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值