[python] 某不科学的美工的瞎搞
谈到 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
自己调的结果