直角坐标系的坐标转换

一、平移

        直角坐标系的平移转换很简单。假设在坐标系XOY下,原点在O(0,0)处,此时坐标系原点想要平移到原坐标系的A(x0,y0)处。那么在原来XOY坐标下的点(x,y),在新的XAY坐标系下的坐标即为:(x-x0,y-y0)

二、绕原点旋转

        当坐标系绕原点旋转θ角度时,在原来XOY坐标系下的点(x1,y1),在旋转后的坐标系的坐标记为(x2,y2),则其关系为:

其推导方式可以用下图中公式,将θ角度的正弦余弦展开带入即可约去求得。 

三、平移+旋转

        平移旋转可以看成是两者的组合。如图,可以是黑色坐标系首先平移到蓝色(x0,y0)的坐标系,蓝色坐标系再旋转θ角度到红色的坐标系。因此有:

四、同一坐标系下的坐标转换

        在一个公共坐标系下有已知坐标和航向的A(xa,ya)、P(xp,yp)两点,A点朝向为φa,P点朝向为轨迹切向,大小为φp。两者都有以朝向方向为X轴的直角坐标系,简称为A坐标系和P坐标系。

那么A的位置在P坐标系下,横纵坐标与航向误差角度的计算公式为:

也就是说,变成了求原本在XOY坐标系下的A点的坐标,现在在P坐标系下的坐标位置。记住这里不是cos(φp-φa)和sin(φp-φa),因为φp是相对于XOY旋转的角度。航向角度以左正右负计算。若P点是距离A点最近的点,也即转化为轨迹的S-L坐标系下A的位置。

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是用C语言实现七参数空间直角坐标坐标转换的示例代码: ``` #include <stdio.h> #include <math.h> #define pi 3.14159265358979323846 // 定义结构体存储七参数 typedef struct SevenParams { double dx; double dy; double dz; double rx; double ry; double rz; double k; } SevenParams; // 定义函数计算旋转矩阵 void calcRotationMatrix(double rx, double ry, double rz, double r[3][3]) { double sinrx = sin(rx * pi / 180.0); double cosrx = cos(rx * pi / 180.0); double sinry = sin(ry * pi / 180.0); double cosry = cos(ry * pi / 180.0); double sinrz = sin(rz * pi / 180.0); double cosrz = cos(rz * pi / 180.0); r[0][0] = cosry * cosrz; r[0][1] = cosry * sinrz; r[0][2] = -sinry; r[1][0] = sinrx * sinry * cosrz - cosrx * sinrz; r[1][1] = sinrx * sinry * sinrz + cosrx * cosrz; r[1][2] = sinrx * cosry; r[2][0] = cosrx * sinry * cosrz + sinrx * sinrz; r[2][1] = cosrx * sinry * sinrz - sinrx * cosrz; r[2][2] = cosrx * cosry; } // 定义函数进行坐标转换 void coordinateTrans(double x, double y, double z, SevenParams params, double *x_out, double *y_out, double *z_out) { double r[3][3]; calcRotationMatrix(params.rx, params.ry, params.rz, r); double x1 = params.k * (x - params.dx) + r[0][0] * y + r[0][1] * z; double y1 = params.k * (y - params.dy) + r[1][0] * x + r[1][1] * z; double z1 = params.k * (z - params.dz) + r[2][0] * x + r[2][1] * y; *x_out = x1; *y_out = y1; *z_out = z1; } int main() { double x = 100.0; double y = 200.0; double z = 300.0; SevenParams params = {10.0, 20.0, 30.0, 5.0, 10.0, 15.0, 1.0}; double x_out, y_out, z_out; coordinateTrans(x, y, z, params, &x_out, &y_out, &z_out); printf("转换前坐标:(%lf, %lf, %lf)\n", x, y, z); printf("转换后坐标:(%lf, %lf, %lf)\n", x_out, y_out, z_out); return 0; } ``` 在这个示例代码中,我们首先定义了一个存储七参数的结构体 `SevenParams`,包括 `dx`、`dy`、`dz`、`rx`、`ry`、`rz` 和 `k` 七个参数。然后我们定义了一个计算旋转矩阵的函数 `calcRotationMatrix`,它接受三个旋转角度 `rx`、`ry` 和 `rz`,并将计算出的旋转矩阵存储在一个 3x3 的二维数组 `r` 中。最后我们定义了一个进行坐标转换的函数 `coordinateTrans`,它接受一个待转换的直角坐标坐标 `(x, y, z)` 和七参数,计算出转换后的坐标,并将结果存储在 `x_out`、`y_out` 和 `z_out` 中。 在 `main` 函数中,我们定义了一个待转换的坐标 `(100, 200, 300)` 和七参数 `(10, 20, 30, 5, 10, 15, 1)`,然后调用 `coordinateTrans` 函数进行坐标转换,并输出转换前后的坐标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值