Matlab仿真万花尺:从圆内旋轮线到异形齿轮传动的数学与编程实践
1. 项目概述从玩具到数学的奇妙之旅如果你小时候玩过那种由一个塑料大齿轮、一个小齿轮和一支笔组成的“万花尺”绘图玩具那你一定对它能画出那些复杂而精美的对称图案记忆犹新。这个看似简单的玩具背后隐藏的数学原理却一点也不简单——它本质上是圆内旋轮线的物理实现。而用Matlab来仿真这个过程则是一次绝佳的跨学科实践它融合了几何学、运动学、微分方程和计算机图形学。这不仅仅是复现一个童年玩具更是深入理解异形齿轮传动、参数化曲线以及数值仿真的绝佳切入点。对于工程师、数学爱好者或Matlab学习者来说这个项目能带来多重价值。首先它提供了一个直观的、可视化的方式来理解抽象的数学曲线。其次通过调整参数如齿轮半径比、笔孔位置你可以探索几乎无限的图案可能性这本身就是一种创造性的数学实验。最后从编程实现的角度你将接触到向量运算、实时动画、图形句柄操作等Matlab核心技能。无论你是想重温数学之美还是寻找一个有趣的Matlab练手项目这个“万花尺仿真”都能让你在动手实践中获得扎实的收获。2. 核心数学原理与模型构建万花尺的数学本质是研究一个动圆小齿轮在一个定圆大齿轮内部沿内壁纯滚动时动圆上某一点笔尖所描绘出的轨迹。这条轨迹被称为圆内旋轮线。当动圆半径与定圆半径之比为有理数时轨迹是闭合的、周期性的图案若为无理数则轨迹将永不重复最终填满整个环形区域。2.1 旋轮线参数方程推导这是整个仿真的基石。我们建立坐标系以定圆半径为 R的圆心为原点 O。设动圆半径为 r的圆心为 C。初始时动圆上的笔尖点 P 位于与 X 轴正方向重合的位置。动圆在定圆内纯滚动意味着没有滑动。关键的联系在于滚过的弧长相等定圆上被滚过的弧长等于动圆上滚过的弧长。设动圆圆心 C 绕原点 O 转过的角度为 θ即公转角度那么动圆自身绕其圆心 C 转过的角度为 φ即自转角度。根据纯滚动条件有R * θ r * φ由此可得自转与公转的关系φ (R / r) * θ。接下来我们用向量法求点 P 的坐标向量 OC圆心 C 的位置。OC 的长度是R - r方向与 X 轴夹角为 θ。所以OC [(R - r)*cosθ, (R - r)*sinθ]。向量 CP从圆心 C 指向笔尖 P。CP 的长度是ρ这是一个重要参数表示笔尖在动圆上的位置ρ r。但 CP 的方向需要注意。由于动圆在滚动P 点相对于动圆圆心的角度并不是简单的 φ。从初始位置P在X轴正方向开始公转θ角后如果动圆没有自转P点将位于与OC相同的方向上。但实际上动圆自转了φ角且是沿着定圆内侧滚动因此自转方向与公转方向相同。所以P点相对于动圆圆心的角度应为θ φ有些推导会写成 θ - φ这取决于对自转方向的定义我们这里采用更常见的同向相加。因此CP [ρ * cos(θ φ), ρ * sin(θ φ)]。向量 OP点 P 的绝对坐标。OP OC CP。综合以上我们得到圆内旋轮线的参数方程x(θ) (R - r) * cosθ ρ * cos(θ (R/r) * θ) y(θ) (R - r) * sinθ ρ * sin(θ (R/r) * θ)其中θ 是自变量公转角度k R / r是半径比ρ 是笔尖到动圆圆心的距离。注意参数 ρ 非常关键。当ρ r时笔尖位于动圆边缘画出的是标准的圆内旋轮线。当ρ r时笔尖位于动圆内部画出的曲线称为短幅圆内旋轮线图案通常更密集、更复杂。当ρ r时这在物理万花尺中不可能但数学仿真可以称为长幅圆内旋轮线图案会向外扩展。2.2 图案周期性与闭合条件图案是否闭合取决于动圆公转多少圈后笔尖能回到起点。这要求公转角度 θ 变化某个周期 T 后x(θT)和y(θT)与x(θ)和y(θ)完全一致。观察参数方程这要求cosθ和sinθ的周期与cos((1k)θ)和sin((1k)θ)的周期有公倍数。简单来说要使曲线闭合需要(1 R/r)为一个有理数即R/r m/n其中 m, n 为互质整数。此时动圆公转 n 圈后自转了 m 圈笔尖恰好回到起始位置图案闭合。公转的最小周期是n * 2π。如果R/r是无理数曲线将永不闭合最终稠密地覆盖整个环形区域。2.3 从旋轮线到异形齿轮的思考物理万花尺的齿轮并非标准渐开线齿轮而是异形齿轮的一种特殊形式——内啮合齿轮。定圆内齿轮和动圆行星齿轮的齿数比决定了半径比R/r。仿真的过程实际上也是在模拟这对特殊齿轮的啮合运动。在Matlab中我们虽然不直接绘制齿轮齿形但通过控制半径比k和笔尖位置ρ已经完全刻画了这对齿轮传动时从动件笔末端的运动轨迹。这对于理解机构运动学、轨迹生成乃至一些艺术设计如纹样、Logo设计都很有启发。3. Matlab仿真实现与核心代码解析有了清晰的数学模型用Matlab实现就变得有章可循。我们的目标是1. 绘制出最终的静态轨迹图2. 实现动态绘制过程直观展示“笔尖”是如何一步步画出图案的。3.1 静态轨迹绘制向量化计算的效率首先实现最基本的静态图。这里的关键是充分利用Matlab的向量化运算避免使用低效的循环。function drawSpirographStatic(R, r, rho, theta_end) % 参数说明 % R: 定圆外圆半径 % r: 动圆内圆半径 % rho: 笔尖到动圆圆心的距离 % theta_end: 公转角度终点弧度例如 10*pi 表示公转5圈 % 1. 参数检查与设置 if rho r warning(笔尖距离rho大于动圆半径r将绘制长幅旋轮线物理上不可实现); end k R / r; % 半径比 % 生成公转角度θ的数组使用足够多的点以保证曲线光滑 theta linspace(0, theta_end, 5000); % 2. 核心计算向量化参数方程 % 计算中间变量避免重复计算 cos_theta cos(theta); sin_theta sin(theta); inner_angle (1 k) * theta; % θ (R/r)*θ (1k)θ cos_inner cos(inner_angle); sin_inner sin(inner_angle); % 计算轨迹点坐标 x (R - r) * cos_theta rho * cos_inner; y (R - r) * sin_theta rho * sin_inner; % 3. 绘图 figure(Position, [100, 100, 800, 800]); % 设置图形窗口大小 plot(x, y, b-, LineWidth, 1.5); axis equal; % 保证横纵坐标比例相同图形不变形 grid on; title(sprintf(圆内旋轮线 (R%.1f, r%.1f, \\rho%.1f), R, r, rho)); xlabel(X); ylabel(Y); % 4. 可选绘制参考圆和初始位置帮助理解 hold on; % 绘制定圆 rectangle(Position, [-R, -R, 2*R, 2*R], Curvature, [1, 1], ... EdgeColor, k, LineStyle, --, LineWidth, 0.5); % 绘制动圆初始位置 initial_circle_center [R - r, 0]; rectangle(Position, [initial_circle_center(1)-r, -r, 2*r, 2*r], ... Curvature, [1, 1], EdgeColor, r, LineStyle, --, LineWidth, 0.5); % 标记初始笔尖位置 plot(initial_circle_center(1) rho, 0, ro, MarkerFaceColor, r); hold off; end实操要点linspace(0, theta_end, N)生成均匀的角度序列。N的大小影响曲线光滑度对于复杂图案k值大需要增加N以避免图形出现棱角。提前计算cos(theta)和sin(theta)并存入变量在计算x和y时直接调用这比在公式中重复调用三角函数快得多是Matlab性能优化的一个小技巧。axis equal是必须的否则画出的图形会在某个方向上被拉伸失去其真实的几何比例和美感。3.2 动态动画绘制实时可视化运动过程静态图展示了结果而动态动画能揭示图案生成的奥秘教学和演示效果极佳。我们需要用到Matlab的动画循环和drawnow命令。function animateSpirograph(R, r, rho, revolutions) % 参数说明 % revolutions: 动圆公转的圈数 k R / r; total_theta revolutions * 2 * pi; % 总公转角度 % 设置动画步长和间隔 num_steps 1000; % 总步数 theta_array linspace(0, total_theta, num_steps); frame_skip 5; % 每5步绘制一帧平衡流畅度和速度 % 预计算所有轨迹点用于最后绘制完整轨迹 x_full (R - r) * cos(theta_array) rho * cos((1k) * theta_array); y_full (R - r) * sin(theta_array) rho * sin((1k) * theta_array); % 初始化图形窗口 fig figure(Position, [100, 100, 900, 800]); ax axes(Parent, fig); axis(ax, equal); grid(ax, on); hold(ax, on); % 绘制定圆 rectangle(Position, [-R, -R, 2*R, 2*R], Curvature, [1, 1], ... EdgeColor, [0.5, 0.5, 0.5], LineStyle, --, LineWidth, 0.8); % 初始化图形对象空用于更新 h_trace plot(ax, NaN, NaN, b-, LineWidth, 1.5); % 轨迹线 h_arm plot(ax, NaN, NaN, r-, LineWidth, 1); % 动圆半径臂从圆心到笔尖 h_pen plot(ax, NaN, NaN, ro, MarkerFaceColor, r, MarkerSize, 8); % 笔尖 h_circle plot(ax, NaN, NaN, r--, LineWidth, 0.8); % 动圆 title(ax, sprintf(万花尺动态仿真 (R/r %.3f, \\rho/r %.2f), k, rho/r)); xlabel(ax, X); ylabel(ax, Y); % 设置坐标轴范围留一些边距 margin max(R, r) * 0.1; axis(ax, [min(x_full)-margin, max(x_full)margin, ... min(y_full)-margin, max(y_full)margin]); % 动画主循环 trace_x []; trace_y []; for i 1:frame_skip:num_steps theta theta_array(i); % 计算当前帧各元素位置 Cx (R - r) * cos(theta); % 动圆圆心 Cy (R - r) * sin(theta); Px Cx rho * cos((1k) * theta); % 笔尖位置 Py Cy rho * sin((1k) * theta); % 更新轨迹数据 trace_x [trace_x, Px]; trace_y [trace_y, Py]; set(h_trace, XData, trace_x, YData, trace_y); % 更新动圆半径臂 set(h_arm, XData, [Cx, Px], YData, [Cy, Py]); % 更新笔尖位置 set(h_pen, XData, Px, YData, Py); % 更新动圆绘制一个圆 phi_circle linspace(0, 2*pi, 50); circle_x Cx r * cos(phi_circle); circle_y Cy r * sin(phi_circle); set(h_circle, XData, circle_x, YData, circle_y); % 刷新图形 drawnow limitrate; % 使用limitrate比drawnow更快适合简单动画 % 可选添加微小暂停以控制动画速度 % pause(0.01); end % 动画结束后用淡色绘制完整轨迹作为背景对比 plot(ax, x_full, y_full, Color, [0.8, 0.8, 1], LineWidth, 0.5); hold(ax, off); end核心技巧与避坑指南预计算与实时更新x_full和y_full预计算了完整轨迹用于最后绘制背景和确定坐标轴范围。在循环中我们只更新当前帧的数据trace_x,trace_y, 臂、圆等这是制作流畅动画的通用高效方法。图形对象句柄使用h_trace plot(...)获取图形对象的句柄后续通过set(h_trace, XData, ...)来更新数据而不是在循环中反复调用plot创建新对象。后者会极度消耗内存且速度缓慢。drawnow limitrate这是Matlab R2014b后引入的优化命令。drawnow会强制刷新图形并处理所有回调而drawnow limitrate会限制刷新率通常为20帧/秒在动画场景下既能保证流畅观感又能大幅降低CPU占用。如果觉得动画卡顿可以尝试换回drawnow或调整frame_skip参数。坐标轴范围在动画开始前根据预计算的完整轨迹范围设定坐标轴axis(ax, [...])可以防止绘图过程中坐标轴不断自动缩放导致的画面跳动提升观看体验。性能平衡num_steps总步数和frame_skip帧跳过共同决定了动画的精细度和速度。步数越多轨迹越精确跳过的帧越少动画越流畅。需要根据图案复杂度和电脑性能进行调整。对于简单图案num_steps2000,frame_skip2可能就够了对于复杂图案可能需要num_steps5000以上。4. 参数探索与经典图案库万花尺的魅力在于通过改变R,r,ρ三个参数可以生成千变万化的图案。我们可以将这些参数归一化以便更好地探索规律。令R 1作为单位基准则r是一个小于1的正数ρ是一个小于等于r的正数。4.1 参数影响规律总结参数物理意义对图案的影响典型取值范围备注半径比k R/r定圆与动圆半径之比决定齿轮齿数比。核心参数。决定图案的“花瓣”数量、对称性和闭合性。k为有理数时图案闭合分子分母约分后分母大致对应图案的“角点数”或对称重数。k接近整数时图案简单k为复杂分数时图案极其繁复。通常 1。常见范围1.5 到 10 之间。k n/m(n, m互质)图案有 n 个“尖角”或 m 重旋转对称。笔尖相对位置ρ/r笔尖在动圆上的相对位置。ρ/r 1为边缘1为内部。控制图案的“紧凑度”和“环数”。ρ/r越小笔尖越靠近动圆圆心画出的轨迹越靠近定圆内侧图案越“紧实”环数越多。ρ/r 1时图案通常有清晰的尖角。0 ρ/r≤ 1。常用 0.3 到 1。物理万花尺的笔孔通常提供几个固定的ρ/r值。公转圈数N动圆绕定圆滚动的完整圈数。决定图案是否被完整绘制。至少需要公转n圈k n/m中的 n才能形成闭合图案。为了图案饱满通常需要公转n的整数倍圈。至少为nk的分子。通常取n的 2-5 倍。对于无理数k理论上需要无穷圈才能填满区域仿真时设定一个较大值即可看到趋势。4.2 经典参数组合与效果下面是一个可以一键运行的脚本展示几组经典参数产生的截然不同的图案。你可以将其保存为demoSpirograph.m并运行。% demoSpirograph.m - 万花尺经典图案展示 clear; close all; clc; % 设置单位定圆半径 R 1 R 1; % 定义参数组每组为 [r, rho, 公转圈数, 子图标题] param_sets { [1/2, 0.8*(1/2), 4, (a) k2, 简单二尖瓣形], % k2 [1/3, 1/3, 6, (b) k3, 三叶草形], % k3, rhor [1/4, 0.7*(1/4), 8, (c) k4, 方形对称], % k4 [2/5, 0.9*(2/5), 10, (d) k2.5, 五角星形], % k5/22.5 [3/7, 0.6*(3/7), 14, (e) k7/3≈2.333, 复杂对称], % k7/3 [1/pi, 0.8*(1/pi), 20, (f) kπ≈3.14, 非闭合填充] % kπ (无理数) }; figure(Position, [50, 50, 1400, 800]); for i 1:length(param_sets) params param_sets{i}; r params(1); rho params(2); revs params(3); k R / r; theta_end revs * 2 * pi; theta linspace(0, theta_end, 10000); x (R - r) * cos(theta) rho * cos((1k) * theta); y (R - r) * sin(theta) rho * sin((1k) * theta); subplot(2, 3, i); plot(x, y, b-, LineWidth, 1.2); axis equal; grid on; title(params{4}, FontSize, 10); xlabel(X); ylabel(Y); % 将坐标轴范围设定得比图形略大使图形居中 axis([min(x)-0.1, max(x)0.1, min(y)-0.1, max(y)0.1]); end sgtitle(万花尺经典图案示例 (R1), FontSize, 14, FontWeight, bold);运行这段代码你会看到(a)图案当k2(r0.5) 时得到一个简单的二尖瓣形状类似于一个拉长的椭圆。这是最简单的旋轮线之一。(b)图案当k3(r1/3) 且ρr时得到经典的三叶草形状。这是很多Logo设计的灵感来源。(c)图案当k4(r0.25) 时图案呈现四重对称性像一个方形的花朵。(d)图案当k2.5(r0.4) 时由于k5/2图案有5个尖角分子决定但整体旋转对称性是2重分母决定形成了一个五角星状的图案。(e)图案当k7/3(r3/7≈0.4286) 时参数为分数图案变得非常复杂和精致具有7个尖角和丰富的内部结构。(f)图案当kπ(r1/π≈0.3183) 时半径为无理数比图案永不闭合。在有限的公转圈数内你会看到曲线似乎在一个环形区域内“随机”游走逐渐填充空间。如果公转圈数足够多它将近似填满一个圆环。实操心得探索参数时一个有趣的技巧是固定R1然后让r取值为1/nn为整数ρ取r的 0.6 到 0.95 倍这样很容易得到具有 n 个尖角的、清晰美观的图案。例如n5, ρ0.8*r会得到一个漂亮的五角星形。5. 高级扩展与工程化思考掌握了基础仿真后我们可以从工程和艺术角度进行更多探索让这个项目不止于“玩具”。5.1 多级万花尺与复杂轨迹真实的万花尺玩具可能不止两个齿轮。我们可以仿真更复杂的系统例如一个动圆在一个定圆内滚动而动圆内部又有一个更小的齿轮笔尖在该小齿轮上。这相当于两级旋轮线的叠加其数学描述是参数方程的嵌套轨迹方程会变得更加复杂。% 两级万花尺仿真思路伪代码/概念 R1 1; % 最外定圆半径 r1 0.3; % 第一级动圆半径 r2 0.1; % 第二级动圆半径在第一个动圆内部 rho2 0.08; % 笔尖在第二级动圆上的距离 theta ...; % 第一级公转角度 % 第一级动圆圆心 C1 轨迹 C1x (R1 - r1) * cos(theta); C1y (R1 - r1) * sin(theta); % 第二级动圆相对于第一级动圆的自转角度 phi2 % 需要根据第一级动圆与第二级动圆的纯滚动条件推导通常与 theta 成比例 phi2 (r1 / r2) * theta; % 注意方向这里假设同向滚动 % 第二级动圆圆心 C2 的位置相对于C1 C2x_rel (r1 - r2) * cos(phi2); % 假设第二级动圆在第一级动圆内部 C2y_rel (r1 - r2) * sin(phi2); % 笔尖 P 的位置相对于C2 Px_rel rho2 * cos(phi2 (r1/r2)*theta); % 注意角度叠加 Py_rel rho2 * sin(phi2 (r1/r2)*theta); % 最终笔尖绝对坐标 Px C1x C2x_rel Px_rel; Py C1y C2y_rel Py_rel;实现多级仿真需要对运动链进行仔细的几何推导但生成的图案复杂度会呈指数级增长极具视觉冲击力。5.2 生成高分辨率艺术图像与矢量图Matlab 默认的位图输出有时无法满足印刷或高清展示的需求。我们可以利用 Matlab 强大的图形导出功能。% 在绘制完精美的图案后进行高质量导出 fig figure(Units, inches, Position, [0 0 8 8]); % 设置图形单位为英寸定义尺寸 ax axes(Parent, fig); % ... (这里是你的绘图代码例如调用 drawSpirographStatic) ... axis(ax, equal); axis(ax, off); % 关闭坐标轴获得纯净图案 set(ax, Color, none); % 设置背景透明 set(fig, Color, w); % 设置图形背景为白色 % 导出为高分辨率PNG print(fig, my_spirograph.png, -dpng, -r600); % -r600 表示600 DPI % 导出为可缩放的矢量图PDF/EPS适合论文或印刷 print(fig, my_spirograph.pdf, -dpdf, -bestfit); % 或者 % print(fig, my_spirograph.eps, -depsc, -painters);注意事项导出矢量图PDF/EPS时如果图形元素特别是复杂的曲线非常多文件可能会很大打开和渲染速度慢。对于极其复杂的万花尺图案有时导出为高分辨率PNG是更实际的选择。5.3 开发交互式图形用户界面 (GUI)为了让参数探索更加直观可以开发一个简单的GUI。Matlab的App Designer或传统的GUIDE都行这里给出一个使用uicontrol创建简易GUI的思路function simpleSpirographGUI() fig figure(Name, 万花尺参数探索器, NumberTitle, off, ... Position, [100, 100, 1000, 600]); % 创建坐标区域 ax axes(Parent, fig, Units, normalized, Position, [0.35, 0.1, 0.6, 0.8]); % 创建滑块和文本框控件 % 参数R这里固定为1 r, rho, revolutions uicontrol(Style, text, String, 动圆半径 r:, ... Units, normalized, Position, [0.05, 0.85, 0.1, 0.05]); slider_r uicontrol(Style, slider, Min, 0.1, Max, 0.9, Value, 0.3, ... Units, normalized, Position, [0.05, 0.8, 0.25, 0.05], ... Callback, updatePlot); text_r uicontrol(Style, edit, String, 0.3, ... Units, normalized, Position, [0.05, 0.75, 0.05, 0.05], ... Callback, editUpdateR); % 类似地创建 rho 和 revolutions 的控件... % ... (为节省篇幅此处省略 rho 和 revs 的控件代码结构与 r 类似) ... % 创建“绘制”按钮 uicontrol(Style, pushbutton, String, 绘制/更新, ... Units, normalized, Position, [0.1, 0.1, 0.15, 0.08], ... Callback, updatePlot); % 初始化绘图 updatePlot(); % 回调函数定义 function updatePlot(~, ~) R 1; r slider_r.Value; rho slider_rho.Value; % 假设已定义 revs slider_revs.Value; % 假设已定义 % 更新文本框显示 text_r.String num2str(r, %.3f); % ... 更新其他文本框 ... % 计算并绘图 k R / r; theta linspace(0, revs*2*pi, 5000); x (R - r) * cos(theta) rho * cos((1k)*theta); y (R - r) * sin(theta) rho * sin((1k)*theta); cla(ax); plot(ax, x, y, b-, LineWidth, 1.5); axis(ax, equal); grid(ax, on); title(ax, sprintf(R1, r%.3f, \\rho%.3f, k%.3f, r, rho, k)); end function editUpdateR(src, ~) val str2double(src.String); if ~isnan(val) val 0.1 val 0.9 slider_r.Value val; updatePlot(); else src.String num2str(slider_r.Value, %.3f); % 输入无效恢复原值 end end % ... 其他编辑框回调函数 ... end这个简易GUI提供了滑块和输入框来实时调整r、ρ和公转圈数点击按钮即可更新图形。你可以在此基础上增加更多功能如动画按钮、图案保存、参数随机生成等。6. 常见问题与调试技巧在实际编写和运行代码时你可能会遇到以下典型问题问题1画出的图案不对称或扭曲。可能原因1没有使用axis equal命令。Matlab默认的绘图模式会拉伸坐标轴以适应窗口导致图形比例失真。解决方案在plot命令后立即添加axis equal;。可能原因2公转圈数revolutions不足没有画完一个完整周期。解决方案对于有理数k m/n至少需要绘制n圈。可以尝试将圈数设置为n的整数倍如2*n或3*n。问题2动画非常卡顿。可能原因1在循环内使用了plot绘制新线条而不是更新已有线条对象的XData和YData。解决方案参照第3.2节的动态动画代码在循环外创建图形对象h_trace, h_arm等在循环内使用set更新其数据。可能原因2总步数num_steps过多或frame_skip过小导致计算和渲染负担过重。解决方案减少num_steps或增大frame_skip。对于预览num_steps1000,frame_skip5通常能取得平衡。可能原因3使用了drawnow而不是drawnow limitrate。解决方案在动画循环中使用drawnow limitrate。问题3对于某些参数组合图案看起来是“实心”的没有清晰的线条结构。可能原因ρ/r值太小笔尖非常靠近动圆圆心导致轨迹的振幅很小曲线在一个很窄的环形区域内密集缠绕看起来就像实心填充。解决方案增大ρ的值使其接近r例如ρ 0.8*r到r这样图案的“幅度”会变大线条结构会更清晰。问题4想将图案导出用于其他设计软件但线条有锯齿或不够平滑。可能原因在生成轨迹时角度数组theta的点数N不足。解决方案大幅增加linspace(0, theta_end, N)中的N值。对于复杂图案可以尝试N20000或更高。同时在导出矢量图时使用-painters渲染器print命令中指定可以获得由贝塞尔曲线构成的更平滑的矢量输出。问题5如何生成随机的、但保证美观的图案策略完全随机的参数很可能产生杂乱无章的图案。一个有效的策略是随机生成有理数k。例如随机生成两个互质的小整数m和n如2到15之间令k m/nr 1/k假设R1。然后在[0.5*r, 0.95*r]范围内随机选择ρ。这样生成的图案大概率是对称且美观的。这个项目从一个小小的数学玩具出发带你深入了运动学仿真、数值计算和科学可视化的核心领域。当你看到屏幕上由自己编写的代码生成出那些记忆中或超越想象的繁复图案时那种连接起童年趣味、数学严谨与编程创造力的成就感正是技术爱好者最大的乐趣所在。不妨现在就打开Matlab尝试一组属于你自己的神奇参数看看能创造出怎样的几何艺术。