原文:
towardsdatascience.com/exploring-recursive-art-fractals-with-context-free-58a9f045d0f3
在人工智能生成的艺术作品吸引眼球的同时,我们很容易忽视简单、基于规则的生成艺术的魅力。本文介绍了无上下文艺术,这是一个工具,它允许你使用基本的规则和递归来创建复杂、美丽的图案。
Context Free Art 是生成分形、树和其他模式的最小编码的理想选择。
作者使用 Context Free 创建的生成艺术作品
这是一个递归、基于规则的生成程序,它提供了一种直观的方式来观察复杂模式如何从简单、结构化的规则中产生。通过定义基本的“语法”形状和变换,我们可以观察复杂的图案一层层展开。这种方法不仅提供了一种视觉上吸引人的递归探索方法,而且还说明了简单的、可重复的规则如何模拟自然系统和抽象数据结构中的复杂性。
🔍 让我们探索简单的算法如何导致复杂的结构。如果这听起来很有趣,下载软件来跟随学习吧 🙂
简介
Context Free(以及命令行工具 cfdg)是一个数字艺术程序,它接受图像的描述并将其生成为位图、矢量图像,甚至电影。
Context Free 的魔力在于其递归性质:形状可以包含其他形状,而这些形状又可以包含更多的形状。这种递归分层允许从简单的指令中产生复杂和精细的设计。随着我们深入探索,你将看到这个过程如何使创建详细和动态的生成艺术成为可能。
让我们从创建一个简单的程序开始。
开始
在 Context Free 中编写一个简单的程序涉及几个关键组件:
-
形状:图像中的基本图形元素,例如正方形、圆形和三角形。
-
规则:形状的绘制和变换方式。规则可以指定大小、位置、旋转和其他属性。
-
Startshape:这是你绘画的起点。它告诉 Context Free 从哪个形状开始。
由于这是一个视觉软件。让我们通过查看一些代码示例来了解这些元素是如何一起工作的。
示例 1:一个简单的矩形
要绘制一个单独的正方形,我们可以在程序顶部的工具栏上输入并按下 渲染 按钮。
startshape RECTANGLE
shape RECTANGLE
rule {
SQUARE []
}
在这里,我们可以看到我们上面介绍的所有三个元素。它们的结果是一个正方形。
出现了一个矩形
简单来说,在这段代码中:
-
startshape RECTANGLE告诉 Context Free 要绘制的初始形状称为 RECTANGLE。这是设计的起点。 -
然后我们定义
RECTANGLE形状。在这个形状中,我们通过包含规则来指定它将如何绘制。 -
在这种情况下,我们只有一个规则,它是一个原始的
SQUARE[]。这指示 Context Free 画一个正方形。
您可以尝试的其他常见原始形状包括:CIRCLE[] 和 TRIANGLE[]。它们的工作方式相同。
示例 2:添加规则选项
在 SQUARE[] 中的空方括号 [] 表示没有变换(如缩放、旋转或移动)。要改变这一点,您可以更改规则属性:
-
s:大小
-
x:X 坐标
-
y:Y 坐标和
-
r:旋转
如下所示:
startshape EXAMPLE
shape EXAMPLE
rule {
SQUARE [s 1 x 0 y 0] // Center square
SQUARE [s 1.5 x 3 y 3 r 45] // Smaller, rotated, blue square
}
在这个例子中,我们的起始形状 EXAMPLE 由两个正方形组成。
-
第一个
SQUARE[s 1 x 0 y 0]位于中心,大小为 1。 -
第二个
SQUARE [ s 1.5 x 3 y 3 r 45 ]是 1.5 倍大,旋转 45 度,放置在坐标 (3,3)。
到目前为止,一切顺利。
示例 3:一个逐渐变小的矩形
接下来,让我们通过在形状内部调用形状来介绍递归,以创建更有趣的图案。
我们将制作一个向上移动时逐渐缩小的矩形。为此,我们将在自身内部调用形状 RECTANGLE 并调整其垂直位置(y)和大小。
startshape RECTANGLE
shape RECTANGLE
rule {
SQUARE []
RECTANGLE [y 0.95 s 0.97]
}
在这个例子中,RECTANGLE 形状先画一个正方形,然后递归地调用自身,并稍微向上移动(y 0.95)以及缩小比例(s 0.97)。这种递归创建了一系列逐渐缩小并向上爬升的正方形,形成了一个堆叠的、逐渐缩小的正方形图案。
🚀 注意:在 Context Free Art 中,y 的正值将形状向上移动,而负值将形状向下移动。在这里,y 0.95 将每个正方形向上移动 0.95 个单位,使其堆叠在之前的形状之上。
一个规则——矩形的大小会随着 y 坐标的变化而逐渐减小。
递归在生成的形状达到最小大小时结束,此时程序停止进一步的递归并产生最终结果。
这种自我限制的递归赋予了 Context Free Art 从简单指令中创建复杂、有机图案的神奇能力。
Daniele Levis Pelusi 在 Unsplash 上的照片
示例 4:一个分裂的矩形
现在,让我们让矩形在变小时“分支”出来,创建一个带有分裂的图案。
startshape RECTANGLE
shape RECTANGLE
rule {
SQUARE []
RECTANGLE [y 0.95 s 0.97]
}
rule 0.03 {
RECTANGLE [r 45 s 0.5]
RECTANGLE [r -45 s 0.5]
}
分支 – 添加第二个规则
在这个例子中,我们有两个规则:
-
第一条规则先画一个正方形,然后递归地调用 RECTANGLE,稍微向上移动(y 0.95)并使其稍微变小(s 0.97)。
-
第二个规则,以 3%的概率(规则 0.03)指定,偶尔会导致矩形“分裂”成两个更小的矩形。
-
一个矩形向右旋转 45 度(r 45)并缩小到原来的一半大小(s 0.5)。
-
另一个矩形向左旋转 45 度(r -45)并也缩小到原来的一半大小。
换句话说:在每次迭代中,97%的时间矩形被缩小并仅向上移动,正如我们第一个规则所定义的。但 3%的时间,会制作两个新的旋转的RECTANGLE形状。这引入了分支!
示例 5:创建生成树 🌱
现在我们对形状、规则和递归有了基本理解,我们准备了一个更完整的示例,其中包含更多形状,每个形状都有不同的规则集。
startshape SPIKE
// CF::Symmetry = CF::Dihedral, 2
shape SPIKE
rule {
SQUARE []
SPIKE [y 0.95 s 0.97]
}
rule 0.03 {
CIRCLE []
SPIKE [r 90 f 2]
SPIKE [r -90]
}
rule 0.03 {
tree[]
}
shape tree
rule 20 {
SQUARE[]
tree [s .99 y .995 r 2]
}
rule 1 {
SQUARE[]
tree [r 10 s .8 y .995 b .07 z - .07]
tree [r 10 s .8 y .995 f 90 b .01 z -.01]
}
rule 1 {
SQUARE[]
tree [s .99 y .995 f 90]
tree [r 10 s .5 y .995 b .07 z -.07]
tree [r 10 s .5 y .995 f 90 b .01 z -.01]
}
rule 10 {
SQUARE[]
tree [s .99 y .995 r 2 f 90]
}
结果是一个对称的、类似树的结构,带有尖刺和分支,通过递归缩放、定位和低概率分支规则实现。
形状 SPIKE 内部的递归增强了生成路径的复杂性。
-
起始形状:SPIKE 是主要形状,它通过递归绘制一个缩小的正方形(s 0.97)并每次迭代向上移动(y 0.95),形成堆叠效果。
-
变化规则:偶尔,通过将 SPIKE 旋转 90°和-90°来添加圆形形状和侧分支,创建横向尖刺。另一个规则引入了树形,为主结构增加了多样性。
-
形状树:树形通过多个规则添加了分支。
示例 6:引入对称性
一种简单的方法是引入对称性,使复杂的图案更具视觉吸引力。
如果你取消上面代码中的注释行:
startshape SPIKE
CF::Symmetry = CF::Dihedral, 2
(...)
重新运行代码。我们在中心添加了对称性,镜像设计并创建了一个平衡、自然的视觉效果。
二面体对称性沿中心轴镜像设计,创建平衡且复杂的图案。在这种情况下,我们看到使用 CF::Symmetry = CF::Dihedral, 2 的不同变化。
这个对称性函数对于生成复杂、自然的外观图案非常强大。你可以通过增加对称性值到 3、4 或更高来进一步实验,每次增加都会创建独特且有趣的结构的增量。
具有 CF::Symmetry = CF::Dihedral, 5 的不同变化。
最好的部分?每次运行代码时,它都会生成设计的一个不同版本,所以你每次都会得到一个新的变化——保持图像的新鲜和惊喜!
感谢阅读,祝您实验愉快!
我们已经涵盖了众多内容,从创建简单的形状和递归图案到添加对称性以制作复杂、引人注目的设计。Context Free 是一个非常适合对生成艺术感兴趣的任何人的绝佳游乐场。
🎨 学习起来很简单,而且结果总是让人惊喜连连。看着几行代码在每次渲染时都变得生动起来,每次都能创造出独一无二的设计,这感觉真的很神奇。
然而,我们只是触及了皮毛,如果你想要了解更多,可以查看维基页面!
免责声明:我以任何方式都与 Context Free 及其创作者无关;我只是觉得它是一个探索生成艺术的有趣工具,并且认为它可能值得分享。
1150

被折叠的 条评论
为什么被折叠?



