python案例:模拟产生万花尺螺旋线(turtle、parser、turtle图像保存为png)

前言

初学python,需要一点有趣的案例。同时,细节功能足够,且不难明了。
这里提供一个模拟产生万花尺螺环线的程序。
如果您对万花尺不了解,科普内容可见:https://www.bilibili.com/video/BV1w7411q7xH/

万花尺螺环线

您可以将以下代码全文拷贝过去,运行一下。然后再具体看注解。
鉴于我在代码中,已经注解的很详细了。所以就不在正文中多说了。

代码全文

'''
名称:spiroAnimator.py
功能:模拟产生万花尺螺旋线。 科普内容可见:https://www.bilibili.com/video/BV1w7411q7xH/
使用方法:
1:可以不用输入任何参数,直接运行此程序。将展示随机万花尺螺环图形。
2:可以使用parser解析器输入参数,生成指定图形。具体方法举例如下:
  1)将本程序复制到pycharm。
  2)在pycharm的 Run菜单下,找到Edit Configurations菜单。选择对应程序(此时是spiro.py),在Parmmeters栏中输入 --sparams 300 88 0.44  。

From:@小小脚色008
Date:2021-11-4
'''

# 导入库函数
import random, argparse, math, turtle
from PIL import Image
from datetime import datetime


# Spiro类:绘制一个图形
class Spiro:
    # constructor  init初始化部分,在创建实例对象时会自动执行。
    def __init__(self, xc, yc, col, R, r, l):
        # 创建turtle对象。turtle光标。
        self.t = turtle.Turtle()
        self.t.shape('turtle')
        self.step = 5  # 步长5度。
        self.drawingComplete = False  # 完成绘制标识
        self.setparams(xc, yc, col, R, r, l)
        self.restart()
        # 类中的self是对其实例化的意思,平时照用即可。https://blog.csdn.net/weixin_50123771/article/details/108960333

    def setparams(self, xc, yc, col, R, r, l):
        self.xc = xc
        self.yc = yc
        self.col = col
        self.R = int(R)  # 像素点为整数。
        self.r = int(r)
        self.l = l
        # 确定循环截止条件。r/R约分后的分子,就是 圈数,再多就重复了。
        # 比如,若R=100,r=50,则只1圈即可。
        gcdVal = math.gcd(self.r, self.R)
        self.nRot = self.r // gcdVal
        self.k = r / float(R)
        self.a = 0
        # 设置颜色
        self.t.color(*col)

    def restart(self):
        self.drawingComplete = False
        self.t.showturtle()
        self.t.penup()
        R, k, l = self.R, self.k, self.l  # R,k,l本函数自用。
        a = 0.00  # 弧度值
        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)
        self.xl = self.xc + x
        self.yl = self.yc + y  # 使用xl,yl保存当前循环上一个的光标位置。用于计算光标方向。
        self.t.pendown()

    def draw(self):
        # 连续绘制。
        R, k, l = self.R, self.k, self.l
        for 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)
        # 确定绘制完成之后,才能隐藏光标。
        self.t.hideturtle()

    def update(self):
        # 单步执行绘制,非连续。
        if self.drawingComplete:
            return  # 若绘制完成标识为真,则不再执行此函数,直接跳出。
        self.a += self.step
        R, k, l = self.R, self.k, self.l
        a = math.radians(self.a)  # 弧度值
        x = R * ((1 - k) * math.cos(a) + l * k * math.cos((1 - k) * a / k))
        y = R * ((1 - k) * math.sin
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小脚色008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值