猫史档案馆


【TCE的编程小讲堂】【Python】【第二期】如何画出科赫雪花?(上)

用户:Leo腾Leo腾查看:11 回复:7 评论:11 创建时间:2019-12-23T22:14:06


center_image

还有两天就是了,提前祝大家快乐!(我的昵称中的TCE指的是The Christmas Eve哦!)

还有今天之所以要讲科赫雪花,不仅因为圣诞节快到了,还有一个原因,是因为我在某次信息竞赛的时候被同类的题目更到了(哭笑不得)

题目的大概内容是这样的:

输入一个数n,通过程序画出迭代对应次数的分形树

【输入样例】3

【输出样例】

center_image

大家看懂题目了吗?

好的,现在回到科赫雪花

那么,我们先来了解一下科赫雪花的来历:

瑞典人科赫于1904年提出了著名的"雪花"曲线,这种曲线的作法是,从一个正三角形开始,把每条边分成三等份,然后以各边的中间长度为底边。分别向外作正三角形,再把"底边"线段抹掉,这样就得到一个六角形,它共有12条边。再把每条边三等份,以各中间部分的长度为底边,向外作正三角形后,抹掉底边线段。反复进行这一过程,就会得到一个"雪花"样子的曲线。这曲线叫做科赫曲线或雪花曲线。

反复进行这一作图过程,得到的曲线越来越精细。

科赫曲线有着极不寻常的特性,不但它的周长为无限大,而且曲线上任两点之间的距离也是无限大。曲线在任何一点处都连续,但却处处"不可导"(没有确定的切线方向)。该曲线长度无限,却包围着有限的面积。

这种奇怪的几何怪物的发现,向十九世纪的数学家提出了挑战,因为这种曲线打破了人们的直觉观念:连续曲线总能借助于铅笔的不间断移动画出来,局部曲线总是"光滑"的。但是科赫曲线提醒人们,在研究无穷过程时,直觉是一个很不可靠的向导,这种挑战迫使数学家们为其职业制定更高更严的标准,曲线的定义也需要加以修改,以适应类似这种"病态"的雪花怪物。

科赫雪花的画法:

1、任意画一个正三角形,并把每一边三等分;

2、取三等分后的一边中间一段为边向外作正三角形,并把这"中间一段"擦掉;

3、重复上述两步,画出更小的三角形。

4、一直重复,直到无穷,所画出的曲线叫做科赫曲线。

center_image

那么,我们如何通过编程画出科赫雪花呢?

首先,我们先要画出科赫雪花的一条边

首先,我们先定义一个叫koch的函数,我们用它来画科赫雪花的其中一条边

center_image

我们观察一下这个图形

首先,画笔往前走了一段距离,然后左转60度,之后向前再走一段距离,向右转120度,再向前走一段距离,向左旋转60度,最后再向前走一段距离,大功告成!

那么,我们就可以得到我么的代码了!

import turtle
def koch(l):
    turtle.forward(l / 4)
    turtle.left(60)
    turtle.forward(l / 4)
    turtle.right(120)
    turtle.forward(l / 4)
    turtle.left(60)
    turtle.forward(l / 4)
turtle.up()
turtle.back(150)
turtle.down()
koch(400)
turtle.done()

可是,我们需要实现的是迭代的层数可以随着输入的量而变化的科赫雪花,而这个离我们的目标差远了

那么应该如何实现我们想要的效果呢?

(提示:可以使用递归算法)

好的,那么本次的教学就到这里结束了,后续会为大家带来迭代的层数可以随着输入的量而变化的科赫雪花函数教程

如果想要看到后续内容,欢迎来论坛搜索【TCE的编程小讲堂】关键词找我哦!

本人是学生党,用上学时间赶出来的帖子,如果有不详细之处还望谅解

往期内容:

第一期:【TCE的编程小讲堂】【Python】【第一期】Pyautogui干货(上)

网址:https://shequ.codemao.cn/community/210335


回复

上一页1 页 / 共 1下一页
JohnsonJohnson

python?

点赞0


评论


Lai追求Lai追求

帮顶

点赞0


评论


猫悟淡猫悟淡

额,报错········center_image

点赞0


评论


DTS_A珲DTS_A珲

挖坟

点赞0


评论


铭记于心_YuXin铭记于心_YuXin

 

import turtle as t
def koch(size, n):
    if n == 0:
        t.fd(size)
    else:
        for angle in [0, 60, -120, 60]:
           t.left(angle)
           koch(size/3, n-1)
def main():
    t.setup(600,600)
    t.penup()
    t.goto(-200, 100)
    t.pendown()
    t.pensize(2)
    level = 3      # 3阶科赫雪花,阶数
    koch(400,level)     
    t.right(120)
    koch(400,level)
    t.right(120)
    koch(400,level)
    t.hideturtle()
main()

点赞0


评论


星星上的雪花星星上的雪花

大佬nb,收藏

点赞0


评论


毁灭者明世隐毁灭者明世隐

挖(2019?)

点赞0


评论