美文网首页GeeksforGeeks articles
科赫雪花的python3实现(递归,非递归)

科赫雪花的python3实现(递归,非递归)

作者: gattonero | 来源:发表于2018-12-03 00:03 被阅读0次

    Koch Curve(Koch Snowflake)
    https://www.geeksforgeeks.org/koch-curve-koch-snowflake/

    简介:

    科赫雪花(科赫曲线)是最早发现的分形曲线之一,由瑞典科学家 Helge von Koch 在论文中构造

    科赫雪花的面积趋向于原始三角形的8/5,而周长趋向无穷大

    构造过程:


    原始三角形 每边三等分 在三等分点上构建新三角形 继续每边三等分 继续在三等分点上构建新三角形

    ...

    科赫雪花可一通过下列规则描述
    rewrite system (Lindenmayer system):
    Alphabet : F
    Constants : +, ?
    **Axiom **: F
    Production rules: F ? F+F–F+F

    程序实现

    思路1:
    首先我们把三条边分开处理
    考虑深度为0的情况,显然这条边是一条直线
    考虑深度为1的情况,轨迹如下:


    我们把这个轨迹抽象为“前进”方法,我们就有变成了深度为1的前进方法 = 深度为0的前进方法 x4
    同理我们发现,深度为2的前进方法 = 深度为1的前进方法 x4
    观察到问题的复杂度在不断降低,可以使用递归来处理这样的规律

    from turtle import *
    def snowflake(lengthSide, levels): 
        if levels == 0: 
            forward(lengthSide) 
            return
        lengthSide /= 3.0
        snowflake(lengthSide, levels-1) 
        left(60) 
        snowflake(lengthSide, levels-1) 
        right(120) 
        snowflake(lengthSide, levels-1) 
        left(60) 
        snowflake(lengthSide, levels-1) 
    
    # main function 
    if __name__ == "__main__": 
        speed(0)                    
        length = 300.0          
    
        #分别处理三条边
        for i in range(3):     
            snowflake(length, 4) 
            right(120) 
        exitonclick()     
    

    思路2
    把第0层画的线用0表示,第1层用1表示,那么根据画笔的轨迹我们有
    第0层(三角形) 000
    第1层 011001100110
    第2层 022012211221022002201221122102200220122112210220


    第1层,其余类似

    显然,把上一层的节点复制一遍,中间插入两个当前层次的节点即可。连续相同节点逆时针转120度,非连续相同节点逆时针转60度

    from turtle import *
    def draw(len,target):
        tasks="000"
        step,depth = len/(3**target),0
        while depth<target:
            depth+=1
            tasks = ''.join([s+str(depth)*2+s for s in tasks])
        pre=''
        for task in tasks:
            if pre==task:
                right(120)
            else:
                left(60)
            forward(step)
            pre = task
    
    length = 300.0
    draw(length,3)
    

    相关文章

      网友评论

        本文标题:科赫雪花的python3实现(递归,非递归)

        本文链接:https://www.haomeiwen.com/subject/kmfscqtx.html