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
使用说明
- 基础分形树:最简单的实现,展示分形树的基本原理
- 彩色分形树:添加了颜色变化和叶子效果
- 3D分形树:在三维空间中生成立体分形树
- 交互式生成器:通过GUI调整参数并实时生成分形树
- 动画效果:展示分形树生长的动态过程
运行方法
-
在MATLAB命令窗口中直接输入函数名运行,例如:
basic_fractal_tree() colorful_fractal_tree() threeD_fractal_tree() interactive_fractal_tree() animated_fractal_tree()
参考代码 matlab的分形树代码 www.youwenfan.com/contentcnr/100611.html
参数说明
- 递归深度:控制树的复杂程度(值越大,树越复杂)
- 长度缩减比例:控制每级分支的长度缩减比例(0.5-0.9)
- 分支角度:控制分支之间的角度(10-50度)
- 随机性:增加树的自然感(0-1之间)