如何使用 Turtle 绘制点状呼吸图

问题描述 投票:0回答:2

我的代码在某个时刻之前一直有效,然后在某个地方螺旋式上升。尝试调试它,但没有帮助。

电流输出: 在此输入图片描述 预期输出:类似这样的东西而不是破折号...我使用的是点 在此输入图片描述

from turtle import Turtle, done
from math import pi, copysign

chinky = Turtle()
colours = ["DeepPink2", "DarkTurquoise", "chartreuse3", "CornflowerBlue"]
j = 0


def draw_spirograph(size_of_gap, radius):
    global j
    for i in range(int(360 / size_of_gap)):
        chinky.color(colours[j])
        if j < 3:
            j += 1
        else:
            j = 0
        draw_dotted_circle(radius, 5)
        chinky.setheading(chinky.heading() + size_of_gap)


def draw_dotted_circle(radius, dot_size):
    chinky.penup()
    chinky.sety(radius)

    diameter = 2 * radius
    circumference = pi * diameter
    dot_extent = 360 * dot_size / circumference  # diameter to angle

    times_y_crossed = 0
    x_sign = 1

    while times_y_crossed < 2:
        chinky.dot(dot_size)  # draw the dot
        chinky.right(dot_extent)
        chinky.forward(dot_size)

        chinky.right(dot_extent)  # draw the gap
        chinky.forward(dot_size)

        x_sign_new = copysign(1, chinky.xcor())

        if x_sign_new != x_sign:
            times_y_crossed += 1
            x_sign = x_sign_new

    chinky.pendown()


chinky.speed("fastest")
draw_spirograph(5, 100)
done()
python turtle-graphics
2个回答
0
投票

您可以通过创建自定义圆形函数来使用分段来完成此操作,该函数将绘制具有交替颜色的分段圆。 以一定角度移动乌龟可以让您绘制线段,而无需进行任何三角学。

import turtle as tg

def segCircle(x,y,radius,step):
    colors = ["DeepPink2", "DarkTurquoise", "chartreuse3", "CornflowerBlue"]
    c      = 0                   # color index
    prev   = None                # start of segment
    for a in range(0,360,step):  # run through segment points
        tg.penup()
        tg.goto(x,y)             # center of circle
        tg.setheading(a)         # segment point angle
        tg.forward(radius)       # move to perimeter
        if prev:
            tg.pendown()         # draw line from previous segment point
            tg.color(colors[0])
            colors.append(colors.pop(0)) # rotate colors
            tg.goto(*prev)
            prev = None
        else:
            prev = tg.pos()     # skip every other point

绘制呼吸描记器:

wn = tg.Screen() # setup for "instantaneous drawing"
wn.tracer(0) 

angle  = 10
radius = 100

for a in range(0,360,angle):       # offset circles around center
    tg.penup() 
    tg.goto(0,0)                   # move to origin
    tg.setheading(a)               # set offsetted angle
    tg.forward(radius)             # go to center of circle
    segCircle(*tg.pos(),radius,angle//2) # draw it


wn.update()    # render drawing in one paint
wn.mainloop() 

0
投票

这里。 我使用了维基百科文章中的螺图数学。 我每 0.08 度画一个点。

from turtle import Turtle, done
from math import pi, copysign,cos,sin,lcm,degrees

chinky = Turtle()
colours = ["Violet","CornflowerBlue","DarkTurquoise","chartreuse3","DeepPink2","Orange","Red"  ]
j = 0

def formulaX(R, r, p, t):
    return (R-r)*cos(t) + p*cos((R-r)/r*t)

def formulaY(R, r, p, t):
    return (R-r)*sin(t) - p*sin((R-r)/r*t)

def howManySteps(R,r,t): 
   rots = (lcm(r,R)//R)*360 # total degrees to rotate through
   return int(rots//degrees(t)) # by angle change per step

def draw_spirograph(gap, R, r, p):
   t = 0 # theta 
   dot_size = 5
   b = gap  # angle change per step 
   chinky.up()  # avoid line from center to start
   chinky.goto(formulaX(R, r, p, t), formulaY(R, r, p, t)) # start point theta = 0
   steps = howManySteps(R,r,b)
   for _ in range(0,steps+1):
      t = t+b  # angle of next segment
      chinky.up
      chinky.goto(formulaX(R, r, p, t), formulaY(R, r, p, t)) 
      chinky.color(colours[int(10*t)%len(colours)])
      chinky.dot(dot_size) 
   chinky.up()
   return


chinky.speed("fastest")
draw_spirograph(.08, 96,42,88)
done()

这里 R=96 和 r=42 enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.