学习Python中turtle模块的基本用法(4:绘制科赫曲线和谢尔宾斯基三角形)

news2024/11/15 12:57:49

  科赫曲线和谢尔宾斯基三角形是常见的分形图形(详细介绍见参考文献1),本文使用turtle库绘制这两类图形。

科赫曲线

  科赫曲线的详细介绍见参考文献2,其中的绘图思路是“画正三角形,并把每一边三等分,取三等分后的一边中间一段为边向外作正三角形,并把这“中间一段”擦掉,重复上述两步,画出更小的三角形。”考虑到绘制完三角形再处理每条边的话,使用turtle的绘制函数不便于计算坐标,于是调整为绘制每条边时都将其三等分,只处理要显示的前后两个子边,重复该过程至指定的迭代次数(看下面录制的绘图动画比较直观)。最终的绘图代码及绘图效果如下所示。

from turtle import *

def Kohn(length, n):
    if n==0:
        forward(length)
    else:
        thirdLen=length/3
        Kohn(thirdLen, n-1)
        right(60)
        Kohn(thirdLen, n-1)        
        left(120)
        Kohn(thirdLen, n-1)  
        right(60)
        Kohn(thirdLen, n-1)  

screensize(600,400)
tracer(0, 0)
penup()
goto(-180,-90)
pendown()
Kohn(360,8)
left(120)
Kohn(360,8)
left(120)
Kohn(360,8)
left(120)
hideturtle()
        
exitonclick()

在这里插入图片描述

在这里插入图片描述

谢尔宾斯基三角形

  参考文献3中介绍的谢尔宾斯基三角形的画法有去掉中心法、Chaos Game法和L系统,本文中采用Chaos Game法绘制。最初采用参考文献3中的构造方法绘图,绘图代码及绘出的图形如下所示(判断点是否在三角形内的代码来自参考文献4)。:

def Sierpinski_1(x1,y1,x2,y2,x3,y3):
    maxX=max((x1,x2,x3))
    minX=min((x1,x2,x3))
    maxY=max((y1,y2,y3))
    minY=min((y1,y2,y3))        
    rx=random.randint(minX+1,maxX-1)
    ry=random.randint(minY+1,maxY-1)

    while(not IsInside(x1,y1,x2,y2,x3,y3,rx,ry)):
          rx=random.randint(minX+1,maxX-1)
          ry=random.randint(minY+1,maxY-1)
       
    tmp=((x1,y1),(x2,y2),(x3,y3))[random.randint(0,2)]
    mx=(tmp[0]+rx)/2
    my=(tmp[1]+ry)/2
    penup() 
    goto(mx-1,my)
    pendown()
    right(90)
    circle(1)
    left(90)

screensize(600,400)
tracer(0, 0)
x1=-250
y1=-150
x2=150
y2=-150
x3=0
y3=100

for i in range(0,5000):    
    Sierpinski_1(x1,y1,x2,y2,x3,y3)

hideturtle()

在这里插入图片描述
  估计应该是绘图思路不对,百度谢尔宾斯基三角形的混沌游戏画法,发现步骤都大致相同,但重复的步骤不一致,最终基于参考文献5-6中的介绍,调整绘图思路为:
  1、随机生成三个点A,B,C,组成三角形;
  2、随机生成三角形的一点P;
  3、绘制点P,同时计算P与A,B,C中任意一点的中点,并将中点坐标赋予P;
  4、重复步骤3。
基于上述步骤,重新调整代码,绘图代码及绘图效果如下:

def Sierpinski_2(x1,y1,x2,y2,x3,y3,n):
    maxX=max((x1,x2,x3))
    minX=min((x1,x2,x3))
    maxY=max((y1,y2,y3))
    minY=min((y1,y2,y3))        
    px=random.randint(minX+1,maxX-1)
    py=random.randint(minY+1,maxY-1)

    while(not IsInside(x1,y1,x2,y2,x3,y3,px,py)):
          px=random.randint(minX+1,maxX-1)
          py=random.randint(minY+1,maxY-1)
    penup()
    goto(px-1,py)
    pendown()
    right(90)
    circle(1)
    left(90)

    points=((x1,y1),(x2,y2),(x3,y3))
    for index in range(0,n):
        tmp=points[random.randint(0,2)]
        px=(tmp[0]+px)/2
        py=(tmp[1]+py)/2
        penup() 
        goto(px-1,py)
        pendown()
        right(90)
        circle(1)
        left(90)

screensize(600,400)
tracer(0, 0)
x1=-250
y1=-150
x2=150
y2=-150
x3=0
y3=100

Sierpinski_2(x1,y1,x2,y2,x3,y3,5000)

hideturtle()

在这里插入图片描述
  最后是一个完成的随机版谢尔宾斯基三角形绘制代码

from turtle import *
import random

def IsTrangleOrArea(x1,y1,x2,y2,x3,y3):
    return abs((x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)) / 2.0)

def IsInside(x1,y1,x2,y2,x3,y3,x,y): 
    ABC = IsTrangleOrArea(x1,y1,x2,y2,x3,y3)
    PBC = IsTrangleOrArea(x,y,x2,y2,x3,y3)
    PAC = IsTrangleOrArea(x1,y1,x,y,x3,y3)
    PAB = IsTrangleOrArea(x1,y1,x2,y2,x,y) 
    return (ABC == PBC + PAC + PAB)

    maxX=max((x1,x2,x3))
    minX=min((x1,x2,x3))
    maxY=max((y1,y2,y3))
    minY=min((y1,y2,y3))        
    px=random.randint(minX+1,maxX-1)
    py=random.randint(minY+1,maxY-1)

    while(not IsInside(x1,y1,x2,y2,x3,y3,px,py)):
          px=random.randint(minX+1,maxX-1)
          py=random.randint(minY+1,maxY-1)
    penup()
    goto(px-1,py)
    pendown()
    right(90)
    circle(1)
    left(90)

    points=((x1,y1),(x2,y2),(x3,y3))
    for index in range(0,n):
        tmp=points[random.randint(0,2)]
        px=(tmp[0]+px)/2
        py=(tmp[1]+py)/2
        penup() 
        goto(px-1,py)
        pendown()
        right(90)
        circle(1)
        left(90)

width=600
height=400

screensize(width,400)
tracer(0, 0)

x1=random.randint(1-width/2,width/2-1)
y1=random.randint(1-height/2,height/2-1)
x2=random.randint(1-width/2,width/2-1)
y2=random.randint(1-height/2,height/2-1)
x3=random.randint(1-width/2,width/2-1)
y3=random.randint(1-height/2,height/2-1)
Sierpinski_2(x1,y1,x2,y2,x3,y3,5000)
hideturtle()
exitonclick()

在这里插入图片描述

参考文献
[1]https://baike.baidu.com/item/%E5%88%86%E5%BD%A2/85449?fr=aladdin
[2]https://baike.baidu.com/item/%E7%A7%91%E8%B5%AB%E6%9B%B2%E7%BA%BF/7090673?fromModule=lemma_inlink
[3]https://baike.baidu.com/item/%E8%B0%A2%E5%B0%94%E5%AE%BE%E6%96%AF%E5%9F%BA%E4%B8%89%E8%A7%92%E5%BD%A2?fromModule=lemma_inlink
[4]https://blog.csdn.net/mxw322/article/details/56026607
[5]https://zhuanlan.zhihu.com/p/103610498?utm_source=wechat_session&ivk_sa=1024320u
[6]https://wiki.swarma.org/index.php?title=%E8%B0%A2%E5%B0%94%E5%AE%BE%E6%96%AF%E5%9F%BA%E4%B8%89%E8%A7%92%E5%BD%A2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/79849.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LeetCode】Day194-超级丑数

题目 313. 超级丑数【中等】 题解 之前做过丑数,规定丑数是质因数只包含2,3,5的正整数,而这道题丑数升级为超级丑数,规定为包含的质因数是在primes数组中的正整数 丑数的题解用动态规划,那么超级丑数也可以利用相同的方法解答…

CSS -- CSS元素显示模式总结(块元素,行内元素,行内块元素)

文章目录CSS 的元素显示模式1 什么是元素显示模式2 块元素3 行内元素4 行内块元素5 元素的显示模式总结CSS 的元素显示模式 1 什么是元素显示模式 作用:网页的标签非常多,在不同地方会用到不同类型的标签,了解他们的特点可以更好的布局我们…

[附源码]JAVA毕业设计-学生宿舍故障报修管理信息系统-(系统+LW)

[附源码]JAVA毕业设计-学生宿舍故障报修管理信息系统-(系统LW) 项目运行 环境项配置: Jdk1.8 Tomcat8.5 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff…

开源即巅峰,《Java程序性能优化实战》GitHub三小时标星已超34k

蓦然回首自己做开发已经十年了,这十年中我获得了很多,技术能力、培训、出国、大公司的经历,还有很多很好的朋友。但再仔细一想,这十年中我至少浪费了五年时间,这五年可以足够让自己成长为一个优秀的程序员,…

项目设置分页条件查询接口

一、分页 1、HospPlusConfig中配置分页插件1 /** 2 * 分页插件 3 */ 4 Bean 5 public PaginationInterceptor paginationInterceptor() { 6 return new PaginationInterceptor(); 7 }2、分页Controller方法 HospitalSetController中添加分页方法1 ApiOperation(value "分…

Python学习基础笔记四十二——序列化模块

1、序列化的概念: 序列:就是字符串。 序列化:将原本的字典、列表等内容转换成一个字符串数据类型的过程就叫做序列化。 反序列化:从字符串到数据类型的过程。 2、序列化的目的: 1、以某种存储形式使自定义的数据持…

servlet+Mysql实现的校园论坛管理系统(功能包含登录,首页帖子查看、发帖、个人帖子删除编辑、帖子评论回复、用户管理等)

博客目录servletMysql实现的校园论坛管理系统实现功能截图系统功能使用技术代码完整源码servletMysql实现的校园论坛管理系统 本系统是一个简单的校园论坛系统,学生可以在线发帖并进行帖子评论回复,同同时管理员可以对用户进行管理。 (文末查看完整源码…

win11: cmake+glfw+imgui

下载源码:imgui github地址 将需要的文件拖拽入项目外部库的imgui文件夹 backends文件夹里选择与环境适配的文件,我这里用了glfw和opengl3 目录结构: CMakeLists.txt cmake_minimum_required(VERSION 3.24) project(proforlearn) set(CM…

基于java+springmvc+mybatis+jsp+mysql的实验室计算机故障报修系统

项目介绍 本系统采用java语言开发,后端采用ssm框架,前端采用jsp技术,数据库采用mysql进行数据存储。 前端页面: 功能:首页、设备信息、公告资讯、个人中心、后台管理、联系客服 管理员后台页面: 功能&…

电子学会2020年12月青少年软件编程(图形化)等级考试试卷(二级)答案解析

目录 一、单选题(共25题,每题2分,共50分) 二、判断题(共10题,每题2分,共20分) 三、编程题【该题由测评师线下评分】(共2题,共30分) 青少年软件…

业务流程监控:让多维度监控有了灵魂

需求 《可视化业务流程监控,是解决方案更是运维之道!》一文让我们知道可以借助Grafana 两个插件:Diagram、FlowCharting,满足我们对于图形数据业务流程的可视化监控,但是在使用前需要我们做好以下两点工作&#xff1a…

修复自定义标题word题注错误:错误,文档中没有指定样式的文字以及编号无法随章节变化问题

一、单个修复指定章节号 假设采用自定义样式“毕业”,如果出现类似提示,可以具体操作如下: 光标定位与错误题注的位置,按shift F9 {STYLEREF 1 \s} - 2 将内容修改为 图 {STYLEREF "毕业" \s} - 2 右击,更…

被人叫做砖家模拟器的ChatGPT,它真的靠谱吗?

大家好啊,我是测评君,欢迎来到web测评。 前言 最近很热门的聊天机器人ChatGPT,据说五天时间用户就破了百万,这几天在体验过程中发现了一些问题,今天我就以下列几个方面来跟大家简单的交流下ChatGPT。 ChatGPT怎么注册国…

【博客555】prometheus的step,durations,rate interval,scrape interval对数据查询结果的影响

prometheus的step,durations,rate interval,scrape interval对数据查询结果的影响 1、场景:在查询prometheus数据时出现很多诡异的现象 1、为什么同样的查询语句在不同的时间点查询,对过去某一时刻的数据展示却不一样…

网络拓扑配置案例练习(VRRP,浮动路由,DCHP,三层交换机配置)

网络拓扑配置案例网络拓扑配置案例练习网络拓扑需求描述具体操作命令交换机创建vlan,配置access、trunk口,划分vlanvrrp配置路由配置验证vrrp和浮动路由DHCP配置总结网络拓扑配置案例练习 在这篇文章中将记录网络的常见配置:VRRP&#xff0c…

vue-cli和vue有什么区别

目录 1、什么是 Vue? 2、什么是vue-cli? 3、区别和关联 👉 区别 👉 关联 🍀 扩展知识 “vue-cli”和vue的区别:vue是“vue.js”的简称,是一个成熟的用于构建用户界面的JavaScript渐进式框…

「Docker学习系列教程」9-Docker容器数据卷介绍

通过前面8篇文章的学习,我们已经学会了docker的安装、docker常用的命令已经docker镜像修改后提交的远程镜像仓库及提交到公司的私服仓库中。接下来,我们再来学学Docker另外一个重要的东西-容器数据卷。 我们先来看看一个场景:我们有多个dock…

18. 权重衰退的代码的从零实现和简洁实现

通过一个简单的例子来演示权重衰减。 %matplotlib inline import torch from torch import nn from d2l import torch as d2l0.01就是权重,xi是随机的输入,噪音是均值为0,方差为0.01的一个正态分布 n_train,n_test,num_inputs,batch_size 2…

Alibaba 官方微服务扛把子「SpringCloudAlibaba 全彩学习手册.PDF」,开源学习ing,

最近我在知乎上看过的一个热门回答: 初级 Java 开发面临的最大瓶颈在于,脱离不出自身业务带来的局限。日常工作中大部分时间在增删改查、写写接口、改改 bug,久而久之就会发现,自己的技术水平跟刚工作时相比没什么进步。 所以我们…

Spring Batch 批处理入门案例

引言 书接上篇 何为Spring Batch?怎么玩? ,前面普及了一下Spring Batch 相关介绍,本篇来一个helloword,简单试一下Spring Batch 怎么玩 批量处理流程 开始前,先了解一下Spring Batch程序运行大纲&#x…