We will write a Python program that draws, a pattern of squares that grow bigger, move, and turn. It will use a special function to draw each square and repeat it many times.
Missing Image
We will write a Python program that draws, a pattern of squares that grow bigger, move, and turn. It will use a special function to draw each square and repeat it many times.
Missing Image
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-60
What you should see:
test_draw_transformed_element_logic
test_generate_artistic_pattern_calls_draw_element_correctly
test_generate_artistic_pattern_default_elements
Now, let's write our Python code to draw a grid of squares with different colors and fills. Remember, you'll need to use nested loops and conditional statements.
Here are some helpful code examples from the Turtle documentation:
1. Start your program:
import turtle
2. Set up your drawing screen:
screen = turtle.Screen()
screen.setup(width=650, height=450)
screen.bgcolor("lightgray")
3. Make a turtle:
my_turtle = turtle.Turtle()
4. Basic 'if/elif/else' statement:
if condition1:
print("Option 1!")
elif condition2:
print("Option 2!")
else:
print("Other option!")
5. Nested Loops (loops inside loops):
for row in range(3): # Outer loop for rows
for col in range(4): # Inner loop for columns
# Code here runs for each item in the grid
pass
# Code here runs after each row is complete
pass
6. Setting pen and fill color:
my_turtle.pencolor("red")
my_turtle.fillcolor("lightgray")
7. Drawing a filled shape:
my_turtle.begin_fill()
# code to draw shape
my_turtle.end_fill()
8. Drawing a square:
for _ in range(4):
my_turtle.forward(60)
my_turtle.right(90)
9. Modulo Operator (%
):
remainder = 5 % 2 # remainder will be 1
print(remainder)
10. 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-60
What you should see:
test_draw_transformed_element_logic
test_generate_artistic_pattern_calls_draw_element_correctly
test_generate_artistic_pattern_default_elements
Now, let's review your code. Be ready to talk about:
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.