圣诞节快到了,给我看看你用 Tikz 制作的最好的雪花 :)
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{decorations.fractals}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}[decoration=Koch snowflake]
\draw decorate{decorate{decorate{decorate{(0,0) -- (3,0)}}}};
\draw decorate{decorate{decorate{decorate{(3,0) -- (1.5,-3)}}}};
\draw decorate{decorate{decorate{decorate{(1.5,-3) -- (0,0)}}}};
\end{tikzpicture}
\begin{tikzpicture}
\begin{axis}[axis lines=none]
\addplot+[domain=0:2*pi,samples=1000,mark=none, color=black]
({10*cos(deg(x)) + 2*cos(deg(4*deg(x))) + 2*cos(deg(10*deg(x)))},
{10*sin(deg(x)) + 2*sin(deg(4*deg(x))) + 2*sin(deg(10*deg(x)))});
\end{axis}
\end{tikzpicture}
\end{document}
编辑 :
\documentclass{standalone}
\usepackage{tikz}
\usepackage{pgfplots}
\usetikzlibrary{shadings}
\definecolor{LightBlack}{rgb}{.4,.4,.4}
\definecolor{SoftBlack}{rgb}{.2,.2,.2}
\begin{document}
\begin{tikzpicture}
\fill[top color=LightBlack,bottom color=SoftBlack] (-1,6) rectangle (8,0);
\begin{axis}[axis lines=none]
\addplot+[domain=0:2*pi,samples=37,mark=none, color=white]
({10*cos(10*deg(x)) + 1*cos(2*deg(x)) + 0.2*cos(deg(x)) + 0.1 * cos(0.5*deg(x))},
{10*sin(10*deg(x)) + 1*sin(2*deg(x)) + 0.2*sin(deg(x)) + 0.1 * sin(0.5*deg(x))});
\end{axis}
\end{tikzpicture}
\end{document}
答案1
我认为最好的方法是使用 Lindenmayer 系统。
以下代码定义了用于绘制雪花单个“臂”的 Lindenmayer 规则。我认为“臂”对称至关重要。然后重复此臂,每次旋转 60 度,以产生完整的雪花。
改变 Lindenmayer 规则、规则+
和所转的角度-
以及线宽,会产生惊人数量的可能性。不幸的是,这些图形需要时间来编译,因此在尝试其他规则之前我变得不耐烦,我决定发布初步结果。但使用这些参数非常有趣,我可能会回来设计更多设计 :-)
下图仅使用了两条规则,我将其命名为“A”和“B”:
- 规则A:
F -> FF[+F][-F]
- 规则 B:
F -> ffF[++FF][--FF]
每行雪花的规则和角度相同,不同的外观只是由于线宽的变化。每行的规则和角度如下:
- 第 1 行。规则 A,角度 60
- 第 2 行。规则 A,角度 90
- 第 3 行。规则 B,角度 60
- 第 4 行。规则 B,角度 30
这是代码:
\documentclass{article}
\usepackage{tikz,nopageno}
\usetikzlibrary{lindenmayersystems}
\pgfdeclarelindenmayersystem{A}{
\rule{F -> FF[+F][-F]}
}
\pgfdeclarelindenmayersystem{B}{
\rule{F -> ffF[++FF][--FF]}
}
\tikzset{
type/.style={l-system={#1, axiom=F,order=3,step=4pt,angle=60},
blue, opacity=0.4, line width=.5mm, line cap=round
},
}
\newcommand\drawsnowflake[2][scale=0.2]{
\tikz[#1]
\foreach \a in {0,60,...,300} {
\draw[rotate=\a,#2] l-system;
};
}
\begin{document}
\foreach \width in {.2,.4,...,.8}
{ \drawsnowflake{type=A, line width=\width mm} }
\foreach \width in {.2,.4,...,.8}
{ \drawsnowflake[scale=0.3]{type=A, l-system={angle=90}, line width=\width mm} }
\foreach \width in {.2,.4,...,.8}
{ \drawsnowflake[scale=0.3]{type=B, line width=\width mm} }
\foreach \width in {.2,.4,...,.8}
{ \drawsnowflake{type=B, l-system={angle=30}, line width=\width mm} }
\end{document}
我也必须玩公理!:-)
更新
灵感来自Torbjørn T. 建议的页面,我尝试重现第一个:
为此我采用了一条新规则:
\pgfdeclarelindenmayersystem{C}{
\symbol{G}{\pgflsystemdrawforward}
\rule{F -> F[+F][-F]FG[+F][-F]FG}
}
雪花是用以下材料画出来的:
\drawsnowflake[scale=0.2]{type=C, l-system={order=2}, line width=0.2mm}
\drawsnowflake[scale=0.2]{type=C, l-system={order=2}, line width=0.4mm}
更新:玩转公理
如果我们从不同于简单的公理开始,那么上例中使用的相同规则 (C) 可以产生不同的变化F
。
我设计了一条新规则,旨在生产“板”类型的薄片,它还可以根据公理产生有趣的变化。这是规则:
\pgfdeclarelindenmayersystem{D}{
\symbol{G}{\pgflsystemdrawforward}
\symbol{H}{\pgflsystemdrawforward}
\rule{F -> H[+HG][-HG]G}
\rule{G -> HF}
}
以下是一些变化:
\drawsnowflake[scale=0.5]{type=D, l-system={order=4,angle=60,axiom=GF}, line width=0.7mm}
\drawsnowflake[scale=0.5]{type=D, l-system={order=4,angle=60,axiom=GfF}, line width=0.7mm}
\drawsnowflake[scale=0.5]{type=D, l-system={order=4,angle=60,axiom=FG}, line width=0.7mm}
\drawsnowflake[scale=0.5]{type=D, l-system={order=4,angle=60,axiom=FfG}, line width=0.7mm}
答案2
\documentclass{standalone}
\usepackage{tikz}
\usepackage{bbding}
\usepackage[weather]{ifsym}
\begin{document}
\begin{tikzpicture}
\draw node[font=\fontsize{70}{70}]{\Snowflake\quad\SnowflakeChevron\quad\SnowflakeChevronBold\quad\Snow};
\end{tikzpicture}
\end{document}
答案3
对输出不是很自豪...但是懒得手动输入一些不错的配置文件坐标=)
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{shadows}
\newcommand{\profile}[1][]{
\pgfmathsetseed{1234}
\draw[snowflake,#1] (0:rnd)
\foreach \i in {1,...,10}{
-- (rnd*15:rnd*3+\i)
}
-- ++(0:1) -- (0:15)
\foreach \i in {15,...,20}{
-- (rnd*15:rnd*7+\i)
}
-- ++(0:3)
\foreach \i in {1,3,...,30}{
-- (\i-rnd*3:30-rnd*3)
}
\foreach \i in {20,...,1}{
-- (30-rnd*10:rnd*3+\i)
};
}
\begin{document}
\begin{tikzpicture}[
snowflake/.style={
fill=blue!10,
draw=blue!40,
drop shadow={shadow scale=1.01,shadow xshift=.6},
line join=round,
line cap=round,
line width=5pt,
}
]
\foreach \a in {0,60,...,360}{
\begin{scope}[rotate=\a]
\profile
\profile[cm={-1,0,0,1,(0,0)}]
\end{scope}
}
\end{tikzpicture}
\end{document}
通过改变种子,您会得到不同的雪花...祈祷吧!