generated from mwc/project_drawing
I created the jumping penguin. I was unsure of where to begin, so I tried out translate but it wasn't working so I decided to use iterpolate. debugging was a great tool to figure out how everything was movig along in the animation for when I would get stuck. I had a lot of fun making this animation and seeing the eng product brought me a lot of joy.
134 lines
3.9 KiB
Python
134 lines
3.9 KiB
Python
# drawing.py
|
|
# ----------
|
|
# By Ilma Buraira
|
|
#
|
|
# Draws the image of penguins on an iceberg
|
|
# (Briefly describe what this program does.)
|
|
|
|
from turtle import *
|
|
from math import cos, sin, pi, radians
|
|
|
|
# ---------- Setup ----------
|
|
setup(1000, 800)
|
|
screen = Screen()
|
|
screen.title("Penguin on Ice (with real ovals)")
|
|
screen.bgcolor("white")
|
|
screen.tracer(0)
|
|
|
|
pensize(3)
|
|
pencolor("black")
|
|
|
|
# ---------- Helpers ----------
|
|
def move_to(x, y):
|
|
penup(); goto(x, y); pendown()
|
|
|
|
def filled_rect(x1, y1, x2, y2, fill, outline="black"):
|
|
pencolor(outline)
|
|
fillcolor(fill)
|
|
move_to(x1, y1)
|
|
begin_fill()
|
|
goto(x2, y1)
|
|
goto(x2, y2)
|
|
goto(x1, y2)
|
|
goto(x1, y1)
|
|
end_fill()
|
|
|
|
def draw_oval(cx, cy, rx, ry, tilt=0, fill=None, outline=None, steps=180, pen=None):
|
|
"""Parametric ellipse; steps controls smoothness."""
|
|
ang = radians(tilt)
|
|
def R(x, y): # rotate (x,y) by tilt
|
|
return (x*cos(ang) - y*sin(ang), x*sin(ang) + y*cos(ang))
|
|
pensize(pen if pen else 3)
|
|
pencolor(outline if outline else "")
|
|
fillcolor(fill if fill else "")
|
|
move_to(cx + rx, cy) # start at angle 0
|
|
if fill:
|
|
begin_fill()
|
|
for i in range(1, steps + 1):
|
|
theta = 2*pi*i/steps
|
|
x, y = rx*cos(theta), ry*sin(theta)
|
|
xr, yr = R(x, y)
|
|
goto(cx + xr, cy + yr)
|
|
if fill:
|
|
end_fill()
|
|
|
|
def poly(points, fill=None):
|
|
if fill: fillcolor(fill); begin_fill()
|
|
move_to(*points[0])
|
|
for p in points[1:]:
|
|
goto(*p)
|
|
goto(*points[0])
|
|
if fill: end_fill()
|
|
|
|
def right_triangle(ax, ay, leg1, leg2, angle=0, fill=None):
|
|
"""Right angle at (ax, ay). leg1 along 'angle' degrees, leg2 perpendicular."""
|
|
a = radians(angle)
|
|
B = (ax + leg1*cos(a), ay + leg1*sin(a)) # along angle
|
|
C = (ax - leg2*sin(a), ay + leg2*cos(a)) # 90° to the left
|
|
poly([(ax, ay), B, C], fill=fill)
|
|
|
|
# ---------- Scene ----------
|
|
def background():
|
|
# Ocean (bottom half)
|
|
filled_rect(-500, -150, 500, -400, fill="#3d44c6", outline="#3d44c6")
|
|
|
|
# Iceberg (white with light gray outline)
|
|
pensize(4)
|
|
filled_rect(-500, -60, 120, -150, fill="white", outline="#7f7f7f")
|
|
|
|
def penguins(ax, armtilt, footangle):
|
|
background()
|
|
for x in range (ax, -500, -100):
|
|
setheading(0)
|
|
# Body
|
|
draw_oval(x-60, 10, rx=28, ry=70, tilt=0, fill="black")
|
|
# Belly
|
|
draw_oval(x-42, 12, rx=12, ry=65, tilt=0,fill="white", outline="darkslategray")
|
|
# Arm
|
|
draw_oval(x-65, 0, rx=10, ry=40, tilt=armtilt, fill="black", outline="darkslategray", pen= 1)
|
|
# Head
|
|
draw_oval(x-42, 80, rx=25, ry=25, fill="black")
|
|
# Beak
|
|
right_triangle(x-28, 60, 25, 20, fill="gold")
|
|
# Foot
|
|
right_triangle(x-50, -60, 35, 15, footangle, fill="gold")
|
|
|
|
|
|
#penguin arm movement: armtilt=345
|
|
#foot movement: footangle=35
|
|
|
|
def jump_penguin(ax, ay, armtilt, footangle):
|
|
setheading(0)
|
|
# Body
|
|
draw_oval(ax-60, ay+10, rx=28, ry=70, tilt=0, fill="black")
|
|
# Belly
|
|
draw_oval(ax-42, ay+12, rx=12, ry=65, tilt=0,fill="white", outline="darkslategray")
|
|
# Arm
|
|
draw_oval(ax-65, ay+0, rx=10, ry=40, tilt=armtilt, fill="black", outline="darkslategray", pen= 1)
|
|
# Head
|
|
draw_oval(ax-42, ay+80, rx=25, ry=25, fill="black")
|
|
# Beak
|
|
right_triangle(ax-28, ay+60, 25, 20, fill="gold")
|
|
# Foot
|
|
right_triangle(ax-50, ay-60, 35, 15, footangle, fill="gold")
|
|
|
|
|
|
|
|
|
|
from superturtle.animation import animate
|
|
from superturtle.easing import easeInOutBack
|
|
|
|
for frame in animate(12, debug=False, loop=True):
|
|
ax= frame.interpolate(120, 400, 0, 12)
|
|
ay= frame.interpolate(0,-300, 0,12, easing=easeInOutBack)
|
|
jump_penguin(ax,ay,345,35)
|
|
if frame.index%12<=3:
|
|
penguins(0,0,0)
|
|
elif frame.index%12==4:
|
|
penguins(60,345,35)
|
|
elif frame.index%12==5 or frame.index%12==6:
|
|
penguins(120, 345,35)
|
|
else:
|
|
penguins(120,0,0)
|
|
|
|
input() |