We will write a Python program that draws two triangles of different sizes from the same starting point. One will be small, and the other will be big.
We will write a Python program that draws two triangles of different sizes from the same starting point. One will be small, and the other will be big.
Before we start, let's run the tests to see what we need to fix.
Run this command in your terminal:
pytest module-1.1/blueprint-5/quest-20
What you should see:
test_draw_shape_function_logic
test_draw_scaled_triangles_at_origin_orchestration
Now, let's write our Python code to draw triangles of different sizes. Remember, you'll need to define a function that draws a triangle, and then call it multiple times with different sizes.
Here are some helpful code examples from the Turtle documentation:
1. Define a function that draws a shape with a given size:
def draw_triangle(my_turtle_object, size):
# code to draw a triangle using my_turtle_object and size
pass
2. Call your function with different sizes:
# Create your turtle object first
my_drawing_turtle = turtle.Turtle()
draw_triangle(my_drawing_turtle, 40) # Draw a small triangle
# Reset turtle to origin for next drawing
my_drawing_turtle.penup()
my_drawing_turtle.home()
my_drawing_turtle.pendown()
draw_triangle(my_drawing_turtle, 80) # Draw a bigger triangle
3. Start your program:
import turtle
4. Keep the window open:
screen = turtle.Screen()
screen.exitonclick()
# OR
# turtle.done()
Now, let's run the tests again to see if your code works.
Run this command in your terminal again:
pytest module-1.1/blueprint-5/quest-20
What you should see:
test_draw_shape_function_logic
test_draw_scaled_triangles_at_origin_orchestration
This document provides a quick reference for the Python concepts and turtle
library commands used in the Generative Techniques blueprint.
The turtle's heading determines the direction it faces.
turtle.setheading(angle)
: Sets the turtle's orientation to an absolute angle.
0
degrees: East (right)90
degrees: North (up)180
degrees: West (left)270
degrees: South (down)
This is different from turtle.left()
or turtle.right()
, which turn the turtle relative to its current direction.import turtle
t = turtle.Turtle()
# Face East and draw
t.setheading(0)
t.forward(50)
# Face North and draw
t.setheading(90)
t.forward(50)
# Face West and draw
t.setheading(180)
t.forward(50)
Translation involves moving a shape from one position to another without changing its orientation or size.
turtle.penup()
: Lifts the pen, so the turtle moves without drawing.turtle.goto(x, y)
: Moves the turtle to an absolute position (x, y)
on the screen. The center of the screen is (0,0)
.turtle.pendown()
: Puts the pen down, so the turtle draws when it moves.turtle.home()
: Moves the turtle to the origin (0,0)
and sets its heading to 0 degrees (East). Useful for resetting position.import turtle
t = turtle.Turtle()
def draw_square(size):
for _ in range(4):
t.forward(size)
t.left(90)
# Draw a square at the origin
draw_square(50)
# Translate and draw another square
t.penup()
t.goto(100, 50) # Move to new position
t.pendown()
draw_square(50)
# Reset position and orientation
t.penup()
t.home()
t.pendown()
Scaling changes the size of a shape. This can be achieved by passing a size-modifying parameter to a drawing function.
size
parameter.size
values to draw scaled versions of the shape.import turtle
t = turtle.Turtle()
def draw_triangle(side_length):
for _ in range(3): # Equilateral triangle
t.forward(side_length)
t.left(120)
# Draw a small triangle
draw_triangle(50)
# Reset position (optional, for clarity if drawing from same origin)
t.penup()
t.home() # Go to (0,0), face East
t.pendown()
# Draw a larger triangle
draw_triangle(100)
For simple rotations where the shape is drawn relative to the turtle's current orientation:
turtle.setheading(angle)
to set the turtle's absolute orientation before drawing.turtle.left(angle)
or turtle.right(angle)
for relative turns.import turtle
t = turtle.Turtle()
def draw_rectangle(width, height):
for _ in range(2):
t.forward(width)
t.left(90)
t.forward(height)
t.left(90)
# Draw a rectangle
t.setheading(0) # Base along x-axis (East)
draw_rectangle(100, 50)
# Reset, rotate, and draw again
t.penup()
t.goto(0,0)
t.pendown()
t.setheading(270) # Rotated 90 degrees clockwise (or -90)
draw_rectangle(100, 50)
For precise rotation of points around an origin (typically (0,0)):
math
module: import math
math.radians(degrees)
(Trigonometric functions in math
use radians).math.cos(radians)
and math.sin(radians)
to calculate coordinates.(x, y)
around origin (0,0)
by angle_rad
):
new_x = x * math.cos(angle_rad) - y * math.sin(angle_rad)
new_y = x * math.sin(angle_rad) + y * math.cos(angle_rad)
import math
# Original point
x1, y1 = 100, 0
angle_deg = 60
# Convert angle to radians
angle_rad = math.radians(angle_deg)
# Calculate new coordinates
x2 = x1 * math.cos(angle_rad) - y1 * math.sin(angle_rad)
y2 = x1 * math.sin(angle_rad) + y1 * math.cos(angle_rad)
print(f"Original: ({x1}, {y1})")
print(f"Rotated by {angle_deg} degrees: ({x2}, {y2})")
Functions help organize code, make it reusable, and improve readability.
def function_name(parameter1, parameter2):
# code block
# ...
return result # Optional: sends a value back
return
statement to send a result back to the part of the code that called the function.()
, providing arguments if the function has parameters.def calculate_area(length, width):
"""Calculates the area of a rectangle."""
area = length * width
return area # Send the calculated area back
def demonstrate_calculation():
rect_length = 8
rect_width = 5
# Call the function and store the returned value
calculated_area = calculate_area(rect_length, rect_width)
# Use the returned value
print(f"The area is: {calculated_area}") # Output: The area is: 40
Combine translation, scaling, and rotation within loops to create complex and interesting patterns.
Create a drawing function for a base element, accepting transformation parameters (offset x, offset y, scale factor, rotation angle).
# Example: BASE_SIZE = 20
def draw_transformed_square(t, x_offset, y_offset, scale_factor, rotation_angle):
t.penup()
t.goto(x_offset, y_offset) # Translation
t.setheading(rotation_angle) # Rotation
t.pendown()
side_length = BASE_SIZE * scale_factor # Scaling
for _ in range(4):
t.forward(side_length)
t.left(90)
t.penup()
Use a loop to call this function multiple times, varying the parameters systematically based on the loop counter.
import turtle
# Assume draw_transformed_square and BASE_SIZE are defined
pen = turtle.Turtle()
pen.speed(0) # Fastest
num_elements = 5
for i in range(num_elements):
# Vary parameters based on 'i'
x = i * 30 # Translate x
y = i * 20 # Translate y
scale = 1 + (i * 0.2) # Increase scale
angle = i * 15 # Increase rotation
draw_transformed_square(pen, x, y, scale, angle)
turtle.Turtle()
: Creates a new turtle object.turtle.Screen()
: Gets the drawing screen object.turtle.done()
: Starts the turtle graphics event loop (keeps window open).turtle.exitonclick()
: Closes the window when clicked.turtle.speed(speed)
: Sets the turtle's speed (0 is fastest).turtle.hideturtle()
: Makes the turtle cursor invisible.turtle.pensize(width)
: Sets the pen thickness.turtle.forward(distance)
: Moves the turtle forward.turtle.backward(distance)
: Moves the turtle backward.turtle.left(angle)
: Turns the turtle left by angle
degrees (relative).turtle.right(angle)
: Turns the turtle right by angle
degrees (relative).turtle.setheading(angle)
: Sets the turtle's absolute orientation (0=East, 90=North, 180=West, 270=South).turtle.penup()
: Lifts the pen.turtle.pendown()
: Lowers the pen.turtle.goto(x, y)
: Moves the turtle to absolute coordinates (x, y)
.turtle.home()
: Moves turtle to (0,0) and sets heading to 0.math.radians(degrees)
: Converts an angle from degrees to radians.math.cos(radians)
: Returns the cosine of an angle in radians.math.sin(radians)
: Returns the sine of an angle in radians.