python之万花尺

1、使用模块

import sys, random, argparse
import numpy as np
import math
import turtle
import random
from PIL import Image
from datetime import datetime
from math import gcd

依次使用pip下载即可

2、代码

import sys, random, argparse
import numpy as np
import math
import turtle
import random
from PIL import Image
from datetime import datetime
from math import gcd# A class that draws a spirograph
class Spiro:# constructordef __init__(self, xc, yc, col, R, r, l):# create own turtleself.t = turtle.Turtle()# set cursor shapeself.t.shape('turtle')# set step in degreesself.step = 5# set drawing complete flagself.drawingComplete = False# set parametersself.setparams(xc, yc, col, R, r, l)# initiatize drawingself.restart()# set parametersdef setparams(self, xc, yc, col, R, r, l):# spirograph parametersself.xc = xcself.yc = ycself.R = int(R)self.r = int(r)self.l = lself.col = col# reduce r/R to smallest form by dividing with GCDgcdVal = gcd(self.r, self.R)self.nRot = self.r // gcdVal# get ratio of radiiself.k = r / float(R)# set colorself.t.color(*col)# current angleself.a = 0# restart drawingdef restart(self):# set flagself.drawingComplete = False# show turtleself.t.showturtle()# go to first pointself.t.up()R, k, l = self.R, self.k, self.la = 0.0x = R * ((1 - k) * math.cos(a) + l * k * math.cos((1 - k) * a / k))y = R * ((1 - k) * math.sin(a) - l * k * math.sin((1 - k) * a / k))self.t.setpos(self.xc + x, self.yc + y)self.t.down()# draw the whole thingdef draw(self):# draw rest of pointsR, k, l = self.R, self.k, self.lfor i in range(0, 360 * self.nRot + 1, self.step):a = math.radians(i)x = R * ((1 - k) * math.cos(a) + l * k * math.cos((1 - k) * a / k))y = R * ((1 - k) * math.sin(a) - l * k * math.sin((1 - k) * a / k))self.t.setpos(self.xc + x, self.yc + y)# done - hide turtleself.t.hideturtle()# update by one stepdef update(self):# skip if doneif self.drawingComplete:return# increment angleself.a += self.step# draw stepR, k, l = self.R, self.k, self.l# set anglea = math.radians(self.a)x = self.R * ((1 - k) * math.cos(a) + l * k * math.cos((1 - k) * a / k))y = self.R * ((1 - k) * math.sin(a) - l * k * math.sin((1 - k) * a / k))self.t.setpos(self.xc + x, self.yc + y)# check if drawing is complete and set flagif self.a >= 360 * self.nRot:self.drawingComplete = True# done - hide turtleself.t.hideturtle()# clear everythingdef clear(self):self.t.clear()# A class for animating spirographs
class SpiroAnimator:# constructordef __init__(self, N):# timer value in millisecondsself.deltaT = 10# get window dimensionsself.width = turtle.window_width()self.height = turtle.window_height()# create spiro objectsself.spiros = []for i in range(N):# generate random parametersrparams = self.genRandomParams()# set spiro paramsspiro = Spiro(*rparams)self.spiros.append(spiro)# call timerturtle.ontimer(self.update, self.deltaT)# restart sprio drawingdef restart(self):for spiro in self.spiros:# clearspiro.clear()# generate random parametersrparams = self.genRandomParams()# set spiro paramsspiro.setparams(*rparams)# restart drawingspiro.restart()# generate random parametersdef genRandomParams(self):width, height = self.width, self.heightR = random.randint(50, min(width, height) // 2)r = random.randint(10, 9 * R // 10)l = random.uniform(0.1, 0.9)xc = random.randint(-width // 2, width // 2)yc = random.randint(-height // 2, height // 2)col = (random.random(),random.random(),random.random())return (xc, yc, col, R, r, l)def update(self):# update all spirosnComplete = 0for spiro in self.spiros:# updatespiro.update()# count completed onesif spiro.drawingComplete:nComplete += 1# if all spiros are complete, restartif nComplete == len(self.spiros):self.restart()# call timerturtle.ontimer(self.update, self.deltaT)# toggle turtle on/offdef toggleTurtles(self):for spiro in self.spiros:if spiro.t.isvisible():spiro.t.hideturtle()else:spiro.t.showturtle()# save spiros to image
def saveDrawing():# hide turtleturtle.hideturtle()# generate unique file namedateStr = (datetime.now()).strftime("%d%b%Y-%H%M%S")fileName = 'spiro-' + dateStrprint('saving drawing to %s.eps/png' % fileName)# get tkinter canvascanvas = turtle.getcanvas()# save postscipt imagecanvas.postscript(file=fileName + '.eps')# use PIL to convert to PNGimg = Image.open(fileName + '.eps')img.save(fileName + '.png', 'png')# show turtleturtle.showturtle()# main() function
def main():# use sys.argv if neededprint('generating spirograph...')# create parserdescStr = """This program draws spirographs using the Turtle module. When run with no arguments, this program draws random spirographs.Terminology:R: radius of outer circle.r: radius of inner circle.l: ratio of hole distance to r."""parser = argparse.ArgumentParser(description=descStr)# add expected argumentsparser.add_argument('--sparams', nargs=3, dest='sparams', required=False,help="The three arguments in sparams: R, r, l.")# parse argsargs = parser.parse_args()# set to 80% screen widthturtle.setup(width=0.8)# set cursor shapeturtle.shape('turtle')# set titleturtle.title("Spirographs!")# add key handler for saving imagesturtle.onkey(saveDrawing, "s")# start listeningturtle.listen()# hide main turtle cursorturtle.hideturtle()# checks args and drawif args.sparams:params = [float(x) for x in args.sparams]# draw spirograph with given parameters# black by defaultcol = (0.0, 0.0, 0.0)spiro = Spiro(0, 0, col, *params)spiro.draw()else:# create animator objectspiroAnim = SpiroAnimator(4)# add key handler to toggle turtle cursorturtle.onkey(spiroAnim.toggleTurtles, "t")# add key handler to restart animationturtle.onkey(spiroAnim.restart, "space")# start turtle main loopturtle.mainloop()# call main
if __name__ == '__main__':main()注意缩进,注意运行需要在命令行进行运行虽然在pycharm上可以运行但是没办法自己挑选参数

3、结果

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

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

相关文章

通俗易懂的Python循环讲解

循环用于重复执行一些程序块。从上一讲的选择结构,我们已经看到了如何用缩进来表示程序块的隶属关系。循环也会用到类似的写法。 for循环 for循环需要预先设定好循环的次数(n),然后执行隶属于for的语句n次。 基本构造是 for 元素 in 序列: statemen…

云原生 IaaS 服务:构建下一代云计算基础设施

随着云计算技术的不断演进,云原生成为了现代应用开发和部署的主流趋势。在当今这个快速变化的数字化时代,企业越来越需要灵活、可伸缩、自动化的基础设施来支持他们的业务需求。而云原生 IaaS(Infrastructure as a Service)服务则…

html--宠物

文章目录 htmljscss html <!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>CodePen - Spaceworm</title><script> window.requestAnimFrame (function() {return (window.requestAnimat…

[HDCTF 2023]enc

32位 这里后面运行这个程序居然要 Visual Studio&#xff0c;不然运行不了 IDA打开&#xff0c;直接锁定main函数 看见v9&#xff0c;四个32位&#xff0c;就想到了tea加密 、 标准tea from ctypes import * #tea def decrypt(v, k):v0 c_uint32(v[0])v1 c_uint32(v[1])…

代码随想录阅读笔记-字符串【反转字符串】

题目 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假设数组中的所有字符都是 ASCII 码表中的可打印…

未来已来:科技驱动的教育变革

我们的基础教育数百年来一成不变。学生们齐聚在一个物理空间&#xff0c;听老师现场授课。每节课时长和节奏几乎一致&#xff0c;严格按照课表进行。老师就像“讲台上的圣人”。这种模式千篇一律&#xff0c;并不适用于所有人。学生遇到不懂的问题&#xff0c;只能自己摸索或者…

Linux查看硬件型号详细信息

1.查看CPU &#xff08;1&#xff09;使用cat /proc/cpuinfo或lscpu &#xff08;2&#xff09;使用dmidecode -i processor Dmidecode 这款软件允许你在 Linux 系统下获取有关硬件方面的信息。Dmidecode 遵循 SMBIOS/DMI 标准&#xff0c;其输出的信息包括 BIOS、系统、主板、…

UE4_调试工具_绘制调试球体

学习笔记&#xff0c;仅供参考&#xff01; 效果&#xff1a; 步骤&#xff1a; 睁开眼睛就是该变量在此蓝图的实例上可公开编辑。 勾选效果&#xff1a;

【Linux】进程与可执行程序的关系fork创建子进程写实拷贝的理解

一、进程与可执行程序之间关系的理解 系统会将此时在系统运行的进程的各种属性都以文件的形式给你保存在系统的proc目录下。运行一个程序的时候&#xff0c;本质就是把磁盘中的程序拷贝到内存中&#xff0c;当一个进程运行起来的时候&#xff0c;它本质已经和磁盘中的可执行程序…

基于springboot和mysql实现的在线考试系统

1.项目介绍 一个在线考试系统&#xff0c;考生可以注册&#xff0c;成为本平台的一个用户&#xff0c;然后进行考试&#xff0c;考完生成成绩&#xff0c;同时用户可以查询自己考试的试卷&#xff0c;可以查看试卷解析。 升级改版 新增出卷人角色&#xff0c;主要职责是进入…

滴滴 Flink 指标系统的架构设计与实践

毫不夸张地说&#xff0c;Flink 指标是洞察 Flink 任务健康状况的关键工具&#xff0c;它们如同 Flink 任务的眼睛一般至关重要。简而言之&#xff0c;这些指标可以被理解为滴滴数据开发平台实时运维系统的数据图谱。在实时计算领域&#xff0c;Flink 指标扮演着举足轻重的角色…

【C++】了解一下编码

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. ASCII编码3. unicode4. GBK5. 类型转换 1. 前言 看到string里面还有Template instantiations&#xff1a; string其实是basic_string<char>&#xff0c;它还是一个模板。 再看看wstring&#xff1…

Linux中的文件类型

一、Linux系统如何区分文件类型&#xff1f; Linux系统中不以文件后缀名来区分文件类型&#xff0c;而是通过文件属性中第一列来区分 &#xff08;Linux系统不以文件后缀名区分文件类型&#xff0c;但是不代表Linux系统不使用文件后缀名&#xff0c;LInux系统中的许多工具例如…

如果网络不好 如何下载huggingface上的模型

很多朋友网络不太好&#xff0c;有时候上不了huggingface这样的国外网站&#xff1b; 或者网络流量不太够&#xff0c;想要下载一些stable diffusion模型&#xff0c;或者其他人工智能的大模型的时候&#xff0c;看到动辄几个G的模型文件&#xff0c;不太舍得下载&#xff1b;…

5 张图带你了解分布式事务 Saga 模式中的状态机

大家好&#xff0c;我是君哥。 状态机在我们的工作中应用非常广泛&#xff0c;今天聊一聊分布式事务中间件 Seata 中 Saga 模式的状态机。 1 状态机简介 状态机是一个数学模型&#xff0c;它将工作中的运行状态和流转规则抽象出来&#xff0c;可以协调相关信号来完成预先设定…

Pycharm安装阿里云通义码灵插件图文教程

前提&#xff1a;必须安装pycharm&#xff0c;可以访问 pycharm下载链接打开页面下载 点击下载后&#xff0c;将下载文件打开&#xff0c;然后无脑安装&#xff0c;安装好后继续看。 然后就安装好了&#xff0c;然后关闭安装&#xff0c;然后打开pycharm即可。 &#x1f680;…

如何在idea中配置tomcat服务器,然后部署一个项目

文章目录 前言第一步 先新建一个空项目第二步 添加框架支持第三步 添加配置及如何部署最后一步 运行及检查有没有问题总结 前言 本章学习的是在idea中配置tomcat服务器&#xff0c;然后部署一个项目 如果没有下载Tomcat服务器的可以在上一个博客观看下载及手动部署&#xff0c;…

线程常用方法

一常用方法第一组 1.setName 设置线程名称&#xff0c;使之与参数name相同&#xff1b; 2.getName 返回该线程的名字&#xff1b; 3.start 使该线程开始执行&#xff0c;java虚拟机底层调用该线程的statr0方法&#xff1b; 4.run …

前端学习之css伪元素选择器

伪元素选择器 &#xff08;注释是对各个内容的解释与理解&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>伪元素选择器</title><!-- 双冒号开头一般都称为伪元素&#xff0c;…

面向对象编程第三式: 多态 (Java篇)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…