旋转矩阵应用于向量矩阵报错及物体定位偏差技术求助
问题分析与修正方案
核心错误点
- 角度单位不匹配:Matlab中
cos()/sin()默认接收弧度值,你设置的theta = -45是角度,直接代入会导致旋转角度完全错误。 - 矩阵乘法运算符错误:旋转矩阵与向量的乘法应该用矩阵乘法
*,而非元素逐乘.*,.*会破坏旋转的线性变换逻辑。 - 循环范围非法:
for k = 1:tdims(:,1:8)中,tdims(:,1:8)是二维矩阵,不能作为循环的终止条件,这里实际应该遍历1到4(对应4组x/y坐标)。 - 循环嵌套冗余且逻辑混乱:外层
i循环已经遍历nr行生成坐标,内层j循环又遍历radius长度,会导致重复覆盖tdims数据,完全没必要。 - 旋转原点错误:直接对屏幕坐标(已加上中心偏移)旋转,会以屏幕左上角(0,0)为原点旋转,而非屏幕中心。正确流程应该是:先把坐标平移到原点(减去中心值)→ 旋转 → 平移回中心(加中心值)。
修正后的代码
% 1. 角度转弧度,逆时针45度对应theta = pi/4(Matlab中逆时针为正方向) theta = pi/4; rot_mat = [cos(theta) -sin(theta); sin(theta) cos(theta)]; for i = 1:nr % 先生成以屏幕中心为原点的原始极坐标转直角坐标 x_raw = cos(anglesRad) .* radius(i); y_raw = -sin(anglesRad) .* radius(i); % 2. 对每组坐标执行旋转:用矩阵乘法*实现线性变换 for k = 1:4 v = [x_raw(k); y_raw(k)]; v_rotated = rot_mat * v; % 3. 旋转后平移回屏幕中心 tdims(i,k) = v_rotated(1) + ptb.xcenter; tdims(i,k+4) = v_rotated(2) + ptb.ycenter; end end
优化说明
如果需要顺时针旋转45度,将theta设为-pi/4即可。另外可以通过向量化操作去掉内层循环,提升运行效率:
% 向量化版本,无需内层k循环 theta = pi/4; rot_mat = [cos(theta) -sin(theta); sin(theta) cos(theta)]; for i = 1:nr x_raw = cos(anglesRad) .* radius(i); y_raw = -sin(anglesRad) .* radius(i); % 直接对整组坐标矩阵做旋转 coords_raw = [x_raw; y_raw]; coords_rotated = rot_mat * coords_raw; tdims(i,1:4) = coords_rotated(1,:) + ptb.xcenter; tdims(i,5:8) = coords_rotated(2,:) + ptb.ycenter; end
内容的提问来源于stack exchange,提问作者jadewantsfood90
相关产品推荐
相关产品推荐

