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() |