(๑•͈ᴗ•͈)❀送花给你

用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()

结果生成一张矢量图,如下

posted @ 2022-05-09 21:58  胸前小红花  阅读(62)  评论(0)    收藏  举报