所有由Python实用宝典发布的文章

python 画雪花 —科赫曲线的实现

漂亮的科赫曲线

科赫曲线是一种分形,其形态非常像雪花,因此又被称作科赫雪花雪花曲线。

下面是用python的turtle包让我们来实时画一个如上图所示的雪花

import turtle
def koch(t,n): 
    #定义一个函数 科赫曲线,完成绘画功能
    if n < 5 :
        t.fd(n) 
        return
    m = n/3
    koch(t,m)
    t.lt(60)
    koch(t,m)
    t.rt(120)
    koch(t,m)
    t.lt(60)
    koch(t,m)

def snowflake(t, n):
    # 画一朵雪花,每一边都是一个科赫曲线
    for i in range(3):
        koch(t,n)
        t.rt(120)

bob = turtle.Turtle()
bob.color('black')
bob.penup() # 画笔提起(不能画)
bob.goto(-150,90) #去到这个点
bob.pendown() # 画笔落下(开始画)
snowflake(bob,300) # 调用函数开始画雪花
turtle.mainloop() 

别看这么简短的代码,其实它内含的数学知识可不简单,科赫曲线的生成其实是一个递归的过程,通过不断地递归调用koch,我们可以形成一个不断由等边三角形组成的雪花。如文首所示的那样。维基百科更专业的解释是这样的:

给定线段AB,科赫曲线可以由以下步骤生成:
1. 将线段分成三等份(AC,CD,DB)
2. 以CD为底,向外(内外随意)画一个等边三角形DMC
3. 将线段CD移去
4. 分别对AC,CM,MD,DB重复1~3。
科赫雪花是以等边三角形三边生成的科赫曲线组成的。每条科赫曲线的长度是无限大,它是连续无处可微的曲线。

你还可以对其进行改进,加一个random函数,改一下画笔颜色,可以形成漫天雪花的效果哦。

希望你喜欢这篇文章,欢迎关注公众号 Python实用宝典,会不断地更新Python相关的实用教程哦!

利用python画图(科赫曲线等)(第二弹)

昨天我们写了怎么利用python画出弧线或是圆形,今天我们就在昨天的基础上画出各种花来。

首先我们尝试在弧线的基础上加一道转角度的递归 :

import turtle
import math

bob = turtle.Turtle()                                 
#创造一个turtle object名为bob

print(bob)                                               
#绘制这个object

def arc(t,r,angle):
    arc_length = 2 *math.pi * r *angle /360
    # 求出弧长
    n = 50                                                    
    # 要绘画直线的的次数 
    # n的数值越大越好看,但运行时间会增加 (也可直接用弧长)
    step_length = arc_length/n                    
    # 每一次画线的长度
    step_angle = angle/n                            
    # 每一次画线所变化的角度
    for i in range(n):
        t.fd(step_length)                                
        # 向前画直线
        t.lt(step_angle)                                   
        # 转角度 
    t.lt(120)                                                  
    # 画完一道弧形后转120度
    arc(bob,200,120)                                    
    # 递归语句
turtle.mainloop()                                        
# 保留图形
arc(bob,200,60)                                         
# 调用函数实现实时绘制

这就是通过递归实现的三叶草。
实际上我们只要改一个小参数,就能变成这样一朵很漂亮的花朵。大家猜到是哪一步了吗?

其实就是t.lt(120)变成 t.lt(90),角度一变它就自动画下去了哦。
再小小地变动两个参数,它就带把了。嘿嘿。

如果你注意观察,你会发现花朵的中间都是圆,请问这是哪段代码造成的呢?

python的turtle的魅力可不至于此,你还可以用它来画商标:

还有美丽的雪花!(科赫曲线,明天我们就具体实现这个吧)

利用python实现实时画弧度和圆

现在许多网站追求一种简洁动态的设计,在页面上使用Python实时画出一道弧度是一种展现简洁美的方式,如果能用Python实时画弧度和圆那该多好啊?
接下来直接进入正题,我们如何实现这样的功能呢?

在这里我们用的是python里面的turtle,我们通过不断地变化角度绘画直线从而实现一个圆。源代码如下:

import turtle
import math

bob = turtle.Turtle()
#创造一个turtle object名为bob

def arc(t,r,angle):

    arc_length = 2 *math.pi * r *angle /360
    #求出弧长

    n = 50
    #要绘画直线的的次数

    #n的数值越大越好看,但运行时间会增加 
    step_length = arc_length/n
    #每一次画线的长度
    step_angle = angle/n
    #每一次画线所变化的角度

    for i in range(n):
        t.fd(step_length)
        #向前画直线
        t.lt(step_angle)
        
#转角度
turtle.mainloop()

#保留图形
arc(bob,80,150)
#调用函数实现实时绘制
#bob是名称,80是大小,150是弧度,360即圆 


如:

前者是150度 后者是360度,显然在n=50的情况下画得很粗糙
现在看看n=(int) arc_length

现在是不是平滑一点了? 但是时间也花得更长了。

你可以尽量试试,试出一种更好的算法,我这里推荐的是n=(int)arc_length/2+10

难并不难在实时画弧度或者圆,FLASH也能实现这样的功能,问题是怎样实现与用户交互的功能?强大的python将是很好的选择。