矩阵绘图很慢很卡,苹果M4下虚拟机深度linux arm64

标签: 绘图

杰克王 2026-03-31 15:01:40

% ==============================

% 立体方盒子:旋转 + 缩放 + 平移

% 使用齐次坐标 (4x4 变换矩阵)

% ==============================


% ----- 1. 定义立方体的8个顶点 (3D坐标) -----

% 每个顶点为 (x, y, z),边长为2,中心在原点

V = [-1,  1,  1, -1, -1,  1,  1, -1;   % x

     -1, -1,  1,  1, -1, -1,  1,  1;   % y

     -1, -1, -1, -1,  1,  1,  1,  1];  % z


% ----- 2. 定义立方体的12条棱(连接关系)-----

% 每条棱由两个顶点的索引(从1开始)表示

edges = [1,2; 2,3; 3,4; 4,1;   % 底面

         5,6; 6,7; 7,8; 8,5;   % 顶面

         1,5; 2,6; 3,7; 4,8];  % 垂直棱


% ----- 3. 定义变换参数 -----

theta_x = pi/6;   % 绕X轴旋转30度

theta_y = pi/4;   % 绕Y轴旋转45度

theta_z = pi/3;   % 绕Z轴旋转60度

sx = 1.2; sy = 1.5; sz = 0.8;  % 各方向缩放因子

tx = 2;   ty = 1;   tz = 3;     % 平移量


% ----- 4. 构造变换矩阵(4x4齐次坐标)-----

% 旋转矩阵(绕X轴)

Rx = [1, 0, 0, 0;

      0, cos(theta_x), -sin(theta_x), 0;

      0, sin(theta_x),  cos(theta_x), 0;

      0, 0, 0, 1];


% 旋转矩阵(绕Y轴)

Ry = [cos(theta_y), 0, sin(theta_y), 0;

      0, 1, 0, 0;

      -sin(theta_y), 0, cos(theta_y), 0;

      0, 0, 0, 1];


% 旋转矩阵(绕Z轴)

Rz = [cos(theta_z), -sin(theta_z), 0, 0;

      sin(theta_z),  cos(theta_z), 0, 0;

      0, 0, 1, 0;

      0, 0, 0, 1];


% 缩放矩阵

S = [sx, 0, 0, 0;

     0, sy, 0, 0;

     0, 0, sz, 0;

     0, 0, 0, 1];


% 平移矩阵

T = [1, 0, 0, tx;

     0, 1, 0, ty;

     0, 0, 1, tz;

     0, 0, 0, 1];


% 组合变换(先缩放 → 再旋转 → 最后平移)

% 注意矩阵乘法顺序:从右向左应用

M = T * Rz * Ry * Rx * S;   % 可以调整旋转顺序获得不同效果


% ----- 5. 将顶点转换为齐次坐标(4x8矩阵)-----

V_homo = [V; ones(1, size(V,2))];


% ----- 6. 应用变换 -----

V_transformed = M * V_homo;


% 提取变换后的3D坐标(前三行)

V_new = V_transformed(1:3, :);


% ----- 7. 绘制原始立方体和变换后的立方体 -----

figure;

hold on;

grid on;

axis equal;

view(3);  % 设置3D视角


% 绘制原始立方体(蓝色)

for i = 1:size(edges,1)

    p1 = edges(i,1);

    p2 = edges(i,2);

    plot3([V(1,p1), V(1,p2)], ...

          [V(2,p1), V(2,p2)], ...

          [V(3,p1), V(3,p2)], 'b-', 'LineWidth', 1.5);

end


% 绘制变换后的立方体(红色)

for i = 1:size(edges,1)

    p1 = edges(i,1);

    p2 = edges(i,2);

    plot3([V_new(1,p1), V_new(1,p2)], ...

          [V_new(2,p1), V_new(2,p2)], ...

          [V_new(3,p1), V_new(3,p2)], 'r-', 'LineWidth', 2);

end


% 设置图形属性

xlabel('X轴');

ylabel('Y轴');

zlabel('Z轴');

title('立体方盒子:旋转、缩放、平移(矩阵运算)');

legend('原始立方体', '变换后立方体');

hold off;


回复

杰克王 2026-04-01 #1

3.6.1,4.0.0没问题,2024 2025 2026有问题好像是xlabel 

xlabel('X轴');

ylabel('Y轴');

zlabel('Z轴');

title('立体方盒子:旋转、缩放、平移(矩阵运算)');

legend('原始立方体', '变换后立方体');



回复

重置 提交