MATLAB分形树代码实现

 

MATLAB分形树代码实现

分形树是一种经典的分形结构,通过递归算法可以生成逼真的树木形态。

基础分形树实现

function basic_fractal_tree()
    % 基础分形树参数设置
    figure('Name', '基础分形树', 'NumberTitle', 'off', 'Color', 'w');
    axis equal; axis off; hold on;
    set(gcf, 'Position', [100, 100, 800, 600]);
    
    % 初始参数
    start_point = [0, 0];      % 起始点坐标
    initial_length = 100;      % 初始枝干长度
    initial_angle = pi/2;      % 初始角度 (90度,垂直向上)
    depth = 9;                 % 递归深度
    branch_shrink = 0.75;      % 枝干长度缩减比例
    angle_change = pi/6;       % 分支角度变化 (30度)
    
    % 绘制树干
    draw_branch(start_point, initial_length, initial_angle, depth, ...
                branch_shrink, angle_change);
    
    % 设置图形标题
    title(sprintf('基础分形树 (深度=%d, 缩减比例=%.2f)', depth, branch_shrink), ...
          'FontSize', 14, 'FontWeight', 'bold');
end

function draw_branch(start, length, angle, depth, shrink, angle_delta)
    if depth == 0
        return; % 递归终止条件
    end
    
    % 计算终点坐标
    end_point = start + length * [cos(angle), sin(angle)];
    
    % 设置线条颜色和宽度 (随深度变化)
    color_intensity = 0.5 + 0.5 * (depth / 10); % 深度越深颜色越浅
    line_width = depth * 0.5; % 深度越深线条越细
    
    % 绘制当前枝干
    line([start(1), end_point(1)], [start(2), end_point(2)], ...
         'Color', [0, 0.5*color_intensity, 0], 'LineWidth', line_width);
    
    % 递归绘制左右分支
    new_length = length * shrink;
    
    % 左分支 (角度增加)
    draw_branch(end_point, new_length, angle + angle_delta, depth-1, shrink, angle_delta);
    
    % 右分支 (角度减少)
    draw_branch(end_point, new_length, angle - angle_delta, depth-1, shrink, angle_delta);
    
    % 添加随机性使树更自然
    if depth > 3 && rand > 0.3
        % 随机添加第三个分支
        random_angle = angle + (rand-0.5)*angle_delta*0.5;
        draw_branch(end_point, new_length*0.8, random_angle, depth-2, shrink, angle_delta);
    end
end

彩色分形树实现

function colorful_fractal_tree()
    % 彩色分形树参数设置
    figure('Name', '彩色分形树', 'NumberTitle', 'off', 'Color', 'k');
    axis equal; axis off; hold on;
    set(gcf, 'Position', [100, 100, 800, 600]);
    
    % 初始参数
    start_point = [0, 0];      % 起始点坐标
    initial_length = 100;      % 初始枝干长度
    initial_angle = pi/2;      % 初始角度 (90度,垂直向上)
    depth = 10;                % 递归深度
    branch_shrink = 0.75;      % 枝干长度缩减比例
    angle_change = pi/5;       % 分支角度变化 (36度)
    
    % 绘制树干
    draw_colorful_branch(start_point, initial_length, initial_angle, depth, ...
                         branch_shrink, angle_change, 0);
    
    % 设置图形标题
    title(sprintf('彩色分形树 (深度=%d, 角度=%.0f°)', depth, rad2deg(angle_change)), ...
          'FontSize', 14, 'FontWeight', 'bold', 'Color', 'w');
end

function draw_colorful_branch(start, length, angle, depth, shrink, angle_delta, branch_type)
    if depth == 0
        return; % 递归终止条件
    end
    
    % 计算终点坐标
    end_point = start + length * [cos(angle), sin(angle)];
    
    % 根据深度和分支类型设置颜色
    if branch_type == 0 % 主干
        color = [0.5, 0.25, 0.1]; % 棕色
    else % 分支
        hue = mod(depth/10 + branch_type*0.2, 1); % 色调随深度变化
        color = hsv2rgb([hue, 0.8, 0.7]); % HSV转RGB
    end
    
    % 设置线条宽度 (随深度变化)
    line_width = max(1, depth * 0.6);
    
    % 绘制当前枝干
    line([start(1), end_point(1)], [start(2), end_point(2)], ...
         'Color', color, 'LineWidth', line_width);
    
    % 添加叶子 (在末端)
    if depth <= 2
        leaf_size = 3 + 2*(3-depth);
        rectangle('Position', [end_point(1)-leaf_size/2, end_point(2)-leaf_size/2, leaf_size, leaf_size], ...
                  'Curvature', [1,1], 'FaceColor', [0, 0.5, 0], 'EdgeColor', 'none');
    end
    
    % 递归绘制分支
    new_length = length * shrink;
    
    % 主分支
    draw_colorful_branch(end_point, new_length, angle - angle_delta*0.7, depth-1, shrink, angle_delta, 1);
    
    % 次分支
    draw_colorful_branch(end_point, new_length*0.8, angle + angle_delta*0.5, depth-1, shrink, angle_delta, 2);
    
    % 第三分支 (随机添加)
    if depth > 3 && rand > 0.4
        draw_colorful_branch(end_point, new_length*0.6, angle + angle_delta*0.2, depth-2, shrink, angle_delta, 3);
    end
end

3D分形树实现

function threeD_fractal_tree()
    % 3D分形树参数设置
    figure('Name', '3D分形树', 'NumberTitle', 'off', 'Color', 'w');
    set(gcf, 'Position', [100, 100, 800, 600]);
    rotate3d on; % 启用3D旋转
    
    % 初始参数
    start_point = [0, 0, 0];   % 起始点坐标
    initial_length = 100;      % 初始枝干长度
    initial_angle_h = pi/2;    % 初始水平角度 (90度)
    initial_angle_v = pi/4;    % 初始垂直角度 (45度)
    depth = 8;                 % 递归深度
    branch_shrink = 0.75;      % 枝干长度缩减比例
    angle_change = pi/6;       % 分支角度变化 (30度)
    
    % 绘制树干
    draw_3d_branch(start_point, initial_length, initial_angle_h, initial_angle_v, ...
                   depth, branch_shrink, angle_change);
    
    % 设置图形标题
    title(sprintf('3D分形树 (深度=%d, 缩减比例=%.2f)', depth, branch_shrink), ...
          'FontSize', 14, 'FontWeight', 'bold');
    
    % 设置3D视图
    view(3); 
    grid on;
    xlabel('X'); ylabel('Y'); zlabel('Z');
    axis equal;
end

function draw_3d_branch(start, length, angle_h, angle_v, depth, shrink, angle_delta)
    if depth == 0
        return; % 递归终止条件
    end
    
    % 计算终点坐标 (球坐标转笛卡尔坐标)
    dx = length * sin(angle_v) * cos(angle_h);
    dy = length * sin(angle_v) * sin(angle_h);
    dz = length * cos(angle_v);
    end_point = start + [dx, dy, dz];
    
    % 设置线条颜色和宽度 (随深度变化)
    color_intensity = 0.5 + 0.5 * (depth / 10); % 深度越深颜色越浅
    line_width = depth * 0.4; % 深度越深线条越细
    
    % 绘制当前枝干
    plot3([start(1), end_point(1)], [start(2), end_point(2)], [start(3), end_point(3)], ...
          'Color', [0, 0.5*color_intensity, 0], 'LineWidth', line_width);
    
    % 递归绘制分支
    new_length = length * shrink;
    
    % 水平分支 (角度变化)
    draw_3d_branch(end_point, new_length, angle_h + angle_delta, angle_v, depth-1, shrink, angle_delta);
    draw_3d_branch(end_point, new_length, angle_h - angle_delta, angle_v, depth-1, shrink, angle_delta);
    
    % 垂直分支 (角度变化)
    draw_3d_branch(end_point, new_length, angle_h, angle_v + angle_delta*0.7, depth-1, shrink, angle_delta);
    draw_3d_branch(end_point, new_length, angle_h, angle_v - angle_delta*0.7, depth-1, shrink, angle_delta);
    
    % 随机添加对角分支
    if depth > 3 && rand > 0.5
        draw_3d_branch(end_point, new_length*0.8, angle_h + angle_delta*0.5, angle_v + angle_delta*0.5, ...
                       depth-2, shrink, angle_delta);
    end
end

交互式分形树生成器

function interactive_fractal_tree()
    % 创建图形界面
    fig = figure('Name', '交互式分形树生成器', 'NumberTitle', 'off', ...
                 'Position', [100, 100, 1000, 700], 'MenuBar', 'none', 'ToolBar', 'none');
    
    % 创建绘图区域
    ax = axes('Parent', fig, 'Position', [0.25, 0.1, 0.7, 0.8]);
    axis equal; axis off; hold on;
    set(ax, 'Color', [0.9, 0.95, 1]); % 淡蓝色背景
    
    % 创建控制面板
    uicontrol('Style', 'text', 'Position', [20, 650, 200, 20], ...
              'String', '递归深度 (1-12):', 'HorizontalAlignment', 'left', ...
              'BackgroundColor', [0.8, 0.8, 0.9], 'FontSize', 10);
    depth_slider = uicontrol('Style', 'slider', 'Min', 1, 'Max', 12, 'Value', 7, ...
                             'Position', [20, 625, 200, 20], 'Tag', 'depth');
    
    uicontrol('Style', 'text', 'Position', [20, 590, 200, 20], ...
              'String', '长度缩减比例 (0.5-0.9):', 'HorizontalAlignment', 'left', ...
              'BackgroundColor', [0.8, 0.8, 0.9], 'FontSize', 10);
    shrink_slider = uicontrol('Style', 'slider', 'Min', 0.5, 'Max', 0.9, 'Value', 0.75, ...
                              'Position', [20, 565, 200, 20], 'Tag', 'shrink');
    
    uicontrol('Style', 'text', 'Position', [20, 530, 200, 20], ...
              'String', '分支角度 (10-50度):', 'HorizontalAlignment', 'left', ...
              'BackgroundColor', [0.8, 0.8, 0.9], 'FontSize', 10);
    angle_slider = uicontrol('Style', 'slider', 'Min', 10, 'Max', 50, 'Value', 30, ...
                             'Position', [20, 505, 200, 20], 'Tag', 'angle');
    
    uicontrol('Style', 'text', 'Position', [20, 470, 200, 20], ...
              'String', '随机性 (0-1):', 'HorizontalAlignment', 'left', ...
              'BackgroundColor', [0.8, 0.8, 0.9], 'FontSize', 10);
    random_slider = uicontrol('Style', 'slider', 'Min', 0, 'Max', 1, 'Value', 0.3, ...
                              'Position', [20, 445, 200, 20], 'Tag', 'random');
    
    uicontrol('Style', 'pushbutton', 'Position', [20, 380, 200, 40], ...
              'String', '生成分形树', 'Callback', @generate_tree, ...
              'BackgroundColor', [0.2, 0.6, 0.3], 'ForegroundColor', 'w', ...
              'FontSize', 12, 'FontWeight', 'bold');
    
    uicontrol('Style', 'pushbutton', 'Position', [20, 330, 200, 40], ...
              'String', '保存图像', 'Callback', @save_image, ...
              'BackgroundColor', [0.3, 0.4, 0.8], 'ForegroundColor', 'w', ...
              'FontSize', 12, 'FontWeight', 'bold');
    
    uicontrol('Style', 'pushbutton', 'Position', [20, 280, 200, 40], ...
              'String', '退出', 'Callback', 'close(gcf)', ...
              'BackgroundColor', [0.8, 0.2, 0.2], 'ForegroundColor', 'w', ...
              'FontSize', 12, 'FontWeight', 'bold');
    
    % 添加说明文本
    uicontrol('Style', 'text', 'Position', [20, 100, 200, 160], ...
              'String', {'使用说明:', ...
                        '1. 调整参数滑块', ...
                        '2. 点击"生成分形树"', ...
                        '3. 可旋转/缩放查看', ...
                        '4. 点击"保存图像"保存', ...
                        '5. 深度影响细节层次', ...
                        '6. 比例影响分支密度'}, ...
              'HorizontalAlignment', 'left', 'BackgroundColor', [0.9, 0.9, 0.8], ...
              'FontSize', 10);
    
    % 初始生成树
    generate_tree();
    
    % 生成树函数
    function generate_tree(~, ~)
        % 获取参数值
        depth = round(get(depth_slider, 'Value'));
        shrink = get(shrink_slider, 'Value');
        angle_deg = get(angle_slider, 'Value');
        random_factor = get(random_slider, 'Value');
        
        % 清除旧图形
        cla(ax);
        
        % 设置背景
        set(ax, 'Color', [0.9, 0.95, 1]);
        
        % 初始参数
        start_point = [0, 0];
        initial_length = 100;
        initial_angle = pi/2;
        angle_rad = deg2rad(angle_deg);
        
        % 绘制树干
        draw_interactive_branch(start_point, initial_length, initial_angle, depth, ...
                                shrink, angle_rad, random_factor);
        
        % 设置标题
        title(ax, sprintf('分形树 (深度=%d, 比例=%.2f, 角度=%.0f°, 随机=%.1f)', ...
                depth, shrink, angle_deg, random_factor), ...
              'FontSize', 12, 'FontWeight', 'bold');
        
        % 添加地面
        plot(ax, [-200, 200], [0, 0], 'k-', 'LineWidth', 2);
    end

    % 交互式分支绘制函数
    function draw_interactive_branch(start, length, angle, depth, shrink, angle_delta, random_factor)
        if depth == 0
            return;
        end
        
        % 计算终点坐标
        end_point = start + length * [cos(angle), sin(angle)];
        
        % 设置线条颜色和宽度
        color_intensity = 0.5 + 0.5 * (depth / 12);
        line_width = max(1, depth * 0.5);
        
        % 绘制当前枝干
        line(ax, [start(1), end_point(1)], [start(2), end_point(2)], ...
             'Color', [0, 0.4*color_intensity, 0], 'LineWidth', line_width);
        
        % 添加随机性
        rand_angle1 = angle_delta * (1 + random_factor * (rand - 0.5));
        rand_angle2 = angle_delta * (1 + random_factor * (rand - 0.5));
        rand_shrink = shrink * (0.9 + 0.2 * rand);
        
        % 递归绘制分支
        new_length = length * rand_shrink;
        
        % 左分支
        new_angle1 = angle + rand_angle1;
        draw_interactive_branch(end_point, new_length, new_angle1, depth-1, ...
                                shrink, angle_delta, random_factor);
        
        % 右分支
        new_angle2 = angle - rand_angle2;
        draw_interactive_branch(end_point, new_length, new_angle2, depth-1, ...
                                shrink, angle_delta, random_factor);
        
        % 随机添加第三个分支
        if depth > 3 && rand > 0.5 - random_factor*0.3
            rand_angle3 = angle + (rand-0.5)*angle_delta*0.5;
            draw_interactive_branch(end_point, new_length*0.8, rand_angle3, depth-2, ...
                                    shrink, angle_delta, random_factor);
        end
    end

    % 保存图像函数
    function save_image(~, ~)
        [file, path] = uiputfile({'*.png;*.jpg;*.tif', '图像文件 (*.png, *.jpg, *.tif)'}, ...
                                 '保存分形树图像');
        if file ~= 0
            exportgraphics(gcf, fullfile(path, file), 'Resolution', 300);
            msgbox('图像保存成功!', '成功', 'help');
        end
    end
end

分形树动画效果

function animated_fractal_tree()
    % 创建图形窗口
    fig = figure('Name', '分形树生长动画', 'NumberTitle', 'off', ...
                 'Position', [100, 100, 800, 600], 'Color', 'w');
    ax = axes('Parent', fig);
    axis equal; axis off; hold on;
    set(ax, 'Color', [0.95, 0.98, 1]); % 淡蓝色背景
    
    % 初始参数
    start_point = [0, 0];
    initial_length = 100;
    initial_angle = pi/2;
    max_depth = 9;
    branch_shrink = 0.75;
    angle_change = pi/6;
    
    % 创建动画
    animate_growth(start_point, initial_length, initial_angle, max_depth, ...
                   branch_shrink, angle_change, 1);
    
    % 动画生长函数
    function animate_growth(start, length, angle, depth, shrink, angle_delta, current_depth)
        if current_depth > depth
            return;
        end
        
        % 计算终点坐标
        end_point = start + length * [cos(angle), sin(angle)];
        
        % 设置线条颜色
        color_intensity = 0.5 + 0.5 * (current_depth / depth);
        line_width = current_depth * 0.5;
        
        % 绘制当前枝干 (带动画效果)
        h = line([start(1), end_point(1)], [start(2), end_point(2)], ...
                 'Color', [0, 0.4*color_intensity, 0], 'LineWidth', line_width);
        set(h, 'EraseMode', 'none'); % 防止擦除
        
        % 添加生长动画效果
        for i = 1:10
            temp_end = start + (length * i/10) * [cos(angle), sin(angle)];
            set(h, 'XData', [start(1), temp_end(1)], 'YData', [start(2), temp_end(2)]);
            drawnow;
            pause(0.02);
        end
        
        % 递归绘制分支
        new_length = length * shrink;
        
        % 左分支
        animate_growth(end_point, new_length, angle + angle_delta, depth, ...
                       shrink, angle_delta, current_depth+1);
        
        % 右分支
        animate_growth(end_point, new_length, angle - angle_delta, depth, ...
                       shrink, angle_delta, current_depth+1);
        
        % 随机添加第三个分支
        if current_depth > 2 && rand > 0.3
            random_angle = angle + (rand-0.5)*angle_delta*0.5;
            animate_growth(end_point, new_length*0.8, random_angle, depth, ...
                           shrink, angle_delta, current_depth+1);
        end
    end
    
    % 添加标题
    title('分形树生长动画', 'FontSize', 14, 'FontWeight', 'bold');
end

使用说明

  1. 基础分形树:最简单的实现,展示分形树的基本原理
  2. 彩色分形树:添加了颜色变化和叶子效果
  3. 3D分形树:在三维空间中生成立体分形树
  4. 交互式生成器:通过GUI调整参数并实时生成分形树
  5. 动画效果:展示分形树生长的动态过程

运行方法

参考代码 matlab的分形树代码 www.youwenfan.com/contentcnr/100611.html

参数说明

 

专注于matlab/simulink,电子电路,编程