project_drawing/drawing.py

118 lines
2.3 KiB
Python

# drawing.py
# ----------
# By Patrick Wick
#
# This program will (hopefully) draw a dog
from turtle import *
import math
# for the dog's ears
def ear(rad,color):
pendown()
fillcolor(color)
begin_fill()
# draw an ellipse, rad is the "radius" of the ellipse
for i in range(2):
# two arcs, each one half of the ellipse
circle(rad,90) # long side
circle(rad//25,90) # short side
end_fill()
penup()
# main part of the dog's face
def face(rad,color):
pendown()
fillcolor(color)
begin_fill()
# draw an ellipse, rad is the "radius" of the ellipse
for i in range(2):
# two arcs, each one half of the ellipse
circle(rad,90) # long side
circle(rad//2,90) # short side
end_fill()
penup()
def nose(rad):
# circles are drawn CCW so if the turtle is facing right, the nose is upside down
setheading(180)
pendown()
color = 'black'
fillcolor(color)
begin_fill()
# initial position will need to be shifted +X by rad/2 to be centered
for i in range(3):
forward(rad)
circle(rad,120)
end_fill()
penup()
# reset position and do the dogs septum/upper lip
forward(rad/2)
left(90)
forward(2*rad)
x = xcor()
y = ycor()
pendown()
# swoop right
forward(2*rad)
circle(rad,150)
penup()
goto(x,y)
setheading(270)
pendown()
# swoop left
forward(2*rad)
circle(-rad,150)
penup()
def eye(rad,color):
pendown()
fillcolor(color)
begin_fill()
circle(rad)
end_fill()
penup()
speed(0)
penup()
pencolor('black')
pensize(4)
hideturtle()
faceLength = 200
# these shifts are based on the short and long chord-lengths of the original face ellipse
halfShift = 2*(faceLength/2)*math.sin(math.pi/4)
fullShift = 2*(faceLength)*math.sin(math.pi/4)
right(20)
goto(halfShift*0.5,0)
ear(-faceLength,'sienna')
goto(-halfShift*0.5,0)
right(140)
ear(faceLength,'sienna')
goto(-halfShift*0.5,0)
setheading(-135)
face(faceLength,'white')
goto(-halfShift,-fullShift*1.25)
setheading(-45)
face(faceLength,'sienna')
setheading(0)
goto(-halfShift*0.4,-faceLength/2)
eye(faceLength/12,'black')
goto(halfShift*0.4,-faceLength/2)
eye(faceLength/12,'black')
goto(faceLength/12,-halfShift*1.25)
nose(faceLength/6)
done()