2301_81497993 2025-05-29 08:55 采纳率: 40%
浏览 7
已结题

求两个正方形拼成一个大正方形的MATLAB代码

运行结果可以体现对两个正方形的切割平移来组成大正方形,结果为动图

  • 写回答

4条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-05-29 10:25
    关注

    让【宝码香车】来帮你解答,本回答参考DeepSeek编写,并整理提供。

    如果还有疑问可以点击头像关注私信或评论。如果答案让您满意,请采纳、点赞、关注,非常感谢!

    MATLAB代码:两个正方形拼成一个大正方形

    以下是一个MATLAB代码示例,展示如何将两个小正方形通过切割和平移组合成一个大正方形,并生成动画效果:

    function combine_squares()
        % 设置图形窗口
        figure;
        axis equal;
        axis([0 3 0 3]);
        grid on;
        hold on;
        title('两个正方形组合成大正方形动画');
        
        % 定义两个小正方形(边长为1)
        square1 = [0 0; 1 0; 1 1; 0 1; 0 0];
        square2 = [1.5 1.5; 2.5 1.5; 2.5 2.5; 1.5 2.5; 1.5 1.5];
        
        % 绘制初始状态
        h1 = plot(square1(:,1), square1(:,2), 'b', 'LineWidth', 2);
        h2 = plot(square2(:,1), square2(:,2), 'r', 'LineWidth', 2);
        
        % 创建动画帧
        frames(1) = getframe(gcf);
        
        % 动画步骤1:将红色正方形移动到(0,1)位置
        steps = 20;
        for i = 1:steps
            offset = i/steps * [-1.5 -0.5];
            moved_square2 = square2 + offset;
            set(h2, 'XData', moved_square2(:,1), 'YData', moved_square2(:,2));
            frames(end+1) = getframe(gcf);
            pause(0.05);
        end
        
        % 动画步骤2:将红色正方形切割成两部分
        % 定义切割后的两部分
        part1 = [0 1; 0.5 1; 0.5 2; 0 2; 0 1];
        part2 = [0.5 1; 1 1; 1 2; 0.5 2; 0.5 1];
        
        % 移除原来的红色正方形
        delete(h2);
        
        % 绘制切割后的两部分
        h2a = plot(part1(:,1), part1(:,2), 'r', 'LineWidth', 2);
        h2b = plot(part2(:,1), part2(:,2), 'r', 'LineWidth', 2);
        frames(end+1) = getframe(gcf);
        pause(0.5);
        
        % 动画步骤3:移动右侧部分到(1,0)位置
        for i = 1:steps
            offset = i/steps * [0.5 -1];
            moved_part2 = part2 + offset;
            set(h2b, 'XData', moved_part2(:,1), 'YData', moved_part2(:,2));
            frames(end+1) = getframe(gcf);
            pause(0.05);
        end
        
        % 最终状态:大正方形(边长为√2)
        final_square = [0 0; sqrt(2) 0; sqrt(2) sqrt(2); 0 sqrt(2); 0 0];
        h3 = plot(final_square(:,1), final_square(:,2), 'g--', 'LineWidth', 2);
        legend([h1 h2a h2b h3], {'正方形1', '切割部分1', '切割部分2', '组合后大正方形'});
        frames(end+1) = getframe(gcf);
        
        % 保存为GIF动画
        filename = 'combine_squares.gif';
        for idx = 1:length(frames)
            im = frame2im(frames(idx));
            [A, map] = rgb2ind(im, 256);
            if idx == 1
                imwrite(A, map, filename, 'gif', 'LoopCount', Inf, 'DelayTime', 0.1);
            else
                imwrite(A, map, filename, 'gif', 'WriteMode', 'append', 'DelayTime', 0.1);
            end
        end
        
        disp(['动画已保存为: ' filename]);
    end
    

    代码说明

    1. 首先创建两个小正方形,一个蓝色(位置(0,0)到(1,1)),一个红色(初始位置(1.5,1.5)到(2.5,2.5))
    2. 动画分为三步:
      • 将红色正方形移动到蓝色正方形上方
      • 将红色正方形切割成两部分
      • 将右侧部分移动到下方形成大正方形
    3. 最终显示组合后的大正方形(边长为√2)
    4. 整个过程被记录为帧并保存为GIF动画

    数学原理

    两个边长为1的正方形总面积为2,组合后的大正方形面积也应为2,因此边长应为√2 ≈ 1.414。通过将一个正方形切割成两部分并重新排列,可以实现这一组合。

    运行结果

    运行代码后将生成一个GIF动画文件,展示两个正方形如何通过切割和平移组合成一个大正方形。绿色虚线表示最终组合后的大正方形边界。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月14日
  • 已采纳回答 6月14日
  • 创建了问题 5月29日