谈到 2 月 14 号,就不得不讲到这些年在这个近乎完美的虐狗节中,我的生活了。没错,自从染指了美工这一工作之后,每年的 2 月 14 号撸审美已经成为了我的例行公事。这次也不例外,我带来的是分形科学。

分形(Wiki)是一个非常神♂奇的学问,简单的分形,比如出名的 Sierpinski Triangle,Koch Snowflake 等等,都是经典的并且精简的分形图案,并且具有一些非常有趣的性质(比如有限面积下的无限长曲线)。简单的分形结构可以近乎完美的表示很多事物,那么如果是多种简单分形结构的组合,就可以做出一些难以想象的成果。比如我想画一个连绵起伏的山脉,单纯的三角形并不能满足我对山脉结构的幻想,所以举个例子,对三角形的一部分进行类似于 T-square (fractal) 的迭代,另一部分进行类似于 Koch Snowflake 的迭代,相信我,图形非常好看。(然而我并没有写。。。

不过我还是写了一个 Sierpinski Carpet 的图形的,用的是神奇的 python,先贴代码

#!/usr/bin/cnv python
from PIL import Image

grid = 3 ** 8
filename = "cell{0}x{0}_python.png".format(grid)

dx = [0, 1, 0, 2, 2, 2, 1, 0]
dy = [0, 0, 1, 0, 1, 2, 2, 2]

# #f2a0a1 (242, 160, 161) こうばいいろ
# #f0908d (240, 144, 141) うすべに
# #915c8b (145,  92, 139) ふたあい
# #aa4c8f (170,  76, 143) うめむらさき
# #700843 (112,   8,  67)

background = "#884898"
onthetable = (233, 223, 229)
im = Image.new("RGB", (grid, grid), background)
pix = im.load()
stack = [ (0, 0, grid) ]

while (len(stack) > 0):
    (sx, sy, cell) = stack.pop()
    if (cell == 3):
        # final work
        pix[sx + 1, sy + 1] = onthetable
    else:
        dcel = cell // 3
        # put pixel in center box
        for ii in range(sx + dcel, sx + 2 * dcel):
            for jj in range(sy + dcel, sy + 2 * dcel):
                pix[ii, jj] = onthetable
        # add new work
        for kk in range(0, 8):
            stack.append( (sx + dx[kk] * dcel, sy + dy[kk] * dcel, dcel) )

im.save(filename)

当然,颜色调整很有趣,因为这个图形的迭代结果会造成某一个颜色的占比从一开始的8/9变成0/1,所以自行考虑迭代次数对结果的影响吧。

Result

自己调的结果

reference

  1. Python 3.5.1 documentation
  2. The Python Imaging Library Handbook