基于TikZ与Lindenmayer系统绘制空间填充曲线的问题求助
解决TikZ Lindenmayer系统绘制空间填充曲线的问题
问题分析与修正
1. 核心问题根源
你当前的L-system规则仅生成单向延伸的折线,不具备空间填充的迭代逻辑,同时规则末尾的未闭合结构导致右下角出现多余短线。若目标为Hilbert曲线(典型空间填充曲线),需替换为符合填充逻辑的规则。
2. 修正后的完整代码
\documentclass{article} \usepackage{tikz} \usetikzlibrary[lindenmayersystems] \begin{document} % 定义Hilbert曲线的Lindenmayer系统规则 \pgfdeclarelindenmayersystem{Hilbert}{ \rule{L -> +RF-LFL-FR+} \rule{R -> -LF+RFR+FL-} } % 自动计算自适应参数:阶数、步长、网格边长 \pgfmathsetmacro{\order}{6} \pgfmathsetmacro{\step}{0.25} \pgfmathsetmacro{\side}{pow(2,\order)*\step} \begin{tikzpicture} % 绘制匹配曲线尺寸的背景网格 \draw[gray!30] (0,0) grid (\side,\side); % 绘制空间填充曲线 \draw[black] [l-system={Hilbert, axiom=L, order=\order, step=\step cm, angle=90}] lindenmayer system; \end{tikzpicture} \end{document}
关键调整说明
- 规则修正:新规则通过
L和R的交替替换生成折返、嵌套的填充结构,确保每阶迭代都在正方形区域内扩展,而非单向延伸。 - 多余短线消除:修正后的规则为闭合迭代逻辑,不会产生残留的未绘制线段。
- 自适应网格:通过
\pgfmathsetmacro基于阶数计算正方形边长,网格会随阶数和步长自动缩放,曲线刚好填满整个网格空间。
额外建议
- 若目标曲线非Hilbert曲线,可替换
\pgfdeclarelindenmayersystem内的规则,Peano、Sierpiński等空间填充曲线均有标准L-system定义。 - 阶数越高,建议调小
\step值,避免生成的图形尺寸过大。
内容的提问来源于stack exchange,提问作者Dedechild
相关产品推荐
相关产品推荐

