用IFS和svg绘制一棵树
import numpy as np
import svgwrite
#总概率相加为1
#枫叶
fengye=[(0,0,0,0.5,0,0,0.05),
(0.12,-0.82,0.42,0.42,0,0.2,0.4),
(0.12,0.82,-0.42,0.42,0,0.2,0.4),
(0.1,0,0,0.1,0,0.2,0.15)]
#树
shu=[(0.06,0,0,0.6,0,0,0.1),
(0.04,0,0,-0.5,0,1,0.1),
(0.46,-0.34,0.32,0.38,0,0.6,0.1),
(0.48,0.17,-0.15,0.42,0,1,0.23),
(0.43,-0.26,0.27,0.48,0,1,0.23),
(0.42,0.35,-0.36,0.31,0,0.8,0.23)
]
def IFS(IFS_code,n):
#设置初始点位置
x=0
y=0
#点序列集,初始为空列表
dots=[]
#获取IFS_code中每个仿射变换的概率,最后一个IFS_code元素是概率
P=[c[-1] for c in IFS_code]#取概率
#绘制IFS图形
for dot in range(n):
r=np.random.rand()#生成(0,1)之间的一个随机浮点数
#依据随机数r,选择仿射变换
p0=0
for i,p in enumerate(P):#1.索引 2.对应元素值
p1=p0+p#概率累加
if r>p0 and r<=p1:
k=i
break
else:
p0=p1
#获取6个仿射变换系数
a=IFS_code[k][0]
b=IFS_code[k][1]
c=IFS_code[k][2]
d=IFS_code[k][3]
e=IFS_code[k][4]
f=IFS_code[k][5]
#计算仿射变换后的坐标值
u=a*x+b*y+e
y=c*x+d*y+f
x=u
#仿射变换后的点加入点序列集dots
dots.append((x,y))
return dots
#开始主程序
if __name__ == '__main__':
viewbox_width=400
viewbox_height=400
width=400
height=400
#画个树
_dots = IFS(shu,5000)
dwg = svgwrite.Drawing("test.svg", profile="full", width=width, height=height)
dwg.viewbox(0,0,viewbox_width,viewbox_height)
#dwg.Transform(100,0)
for pot in _dots:
dwg.add(dwg.circle(center=(viewbox_width/2+pot[0]*100,viewbox_height/2-pot[1]*100), r=0.2, fill="black", stroke="black"))
dwg.save()
结果生成一张矢量图,如下