基于矩阵-向量乘法的多边形旋转及Matlab绘图验证问询
在MATLAB中绘制原多边形及旋转后多边形的完整方案
嘿,我来帮你搞定这个MATLAB绘图和多边形旋转的问题,不仅能实现两幅图的对比展示,还能帮你确认旋转代码的合理性~
一、先搞定原多边形的绘制
首先咱们把给定的顶点坐标整理好,MATLAB的fill函数需要传入x和y坐标的向量,所以可以把顶点存成一个2×5的矩阵(每列对应一个(x,y)顶点):
% 定义原多边形的顶点,每列是一个(x,y)坐标 original_vertices = [0, 1, 7/10, 1/2, 3/10; 0, 0, 1, 1/2, 1]; % 提取x和y方向的坐标向量 x_original = original_vertices(1,:); y_original = original_vertices(2,:);
接下来就可以绘制原多边形了,这里推荐用subplot把两幅图放在同一个窗口里,方便对比:
% 创建1行2列的子图布局,第一个位置放原多边形 subplot(1,2,1); fill(x_original, y_original, 'lightblue', 'EdgeColor', 'black'); title('原多边形'); axis equal; % 必须加这个!保持坐标轴比例,避免图形被拉伸变形 grid on;
二、旋转矩阵的实现与旋转后多边形绘制
旋转矩阵的核心逻辑
绕原点逆时针旋转θ角的标准旋转矩阵是:
R = [cosθ -sinθ; sinθ cosθ]
注意!MATLAB里的三角函数都是弧度制的,所以必须先把100度转换成弧度,不然计算出来的旋转角度会完全错误。
代码实现
% 把100度转换成弧度 theta = deg2rad(100); % 定义旋转矩阵 R = [cos(theta), -sin(theta); sin(theta), cos(theta)]; % 用矩阵-向量乘法完成所有顶点的旋转(每列是一个顶点,直接相乘即可) rotated_vertices = R * original_vertices; % 提取旋转后的x、y向量 x_rotated = rotated_vertices(1,:); y_rotated = rotated_vertices(2,:);
然后绘制旋转后的多边形,放在第二个子图位置:
subplot(1,2,2); fill(x_rotated, y_rotated, 'lightcoral', 'EdgeColor', 'black'); title('旋转100度后的多边形'); axis equal; grid on;
三、两幅图的展示方式
上面用的是同窗口分栏展示,如果你想要两个独立的窗口分别展示,也可以换成两个figure命令:
% 第一个独立窗口:原多边形 figure(1); fill(x_original, y_original, 'lightblue', 'EdgeColor', 'black'); title('原多边形'); axis equal; grid on; % 第二个独立窗口:旋转后的多边形 figure(2); fill(x_rotated, y_rotated, 'lightcoral', 'EdgeColor', 'black'); title('旋转100度后的多边形'); axis equal; grid on;
四、旋转代码的合理性验证
咱们来逐条确认这段代码是否满足要求:
- 角度转换正确:用
deg2rad()把100度转成弧度,完全符合MATLAB的三角函数要求,避免了直接用角度代入的低级错误。 - 旋转矩阵合规:严格遵循了标准的逆时针旋转矩阵公式,完全通过矩阵-向量乘法实现旋转,完美契合题目要求。
- 顶点处理高效:把顶点按列存储,一次性完成所有顶点的旋转,代码简洁不冗余,运行效率高。
- 视觉效果准确:添加了
axis equal,确保旋转后的图形不会因为坐标轴比例问题变形,保证了图形的几何准确性。
如果题目没有指定旋转中心,默认绕原点旋转是完全合理的;如果需要绕多边形的中心旋转,只需要先把顶点平移到原点,旋转后再平移回去即可,不过题目里没提这个需求,所以当前的实现完全满足要求。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

