Before anything else, let’s get our hands dirty. Open up that trusty text editor and create a new file called `turtle_transformation.py`. We’re going to be using the Python Turtle module for this one, so make sure you have it installed (if not, just run `pip install turtle` in your terminal).
Now that we’ve got our environment set up, Let’s begin exploring with some code. Here’s a basic example of how to use the `shearfactor()`, `shapetransform()`, and `get_shapepoly()` methods:
# Import the turtle module and the math module
import turtle as t
from math import sin, cos
# Set up our window size and background color
t.setup(width=800, height=600)
t.bgcolor('black')
# Define a function to draw a square with some transformation applied
def draw_square():
# Set the speed to the fastest for smoother animation
t.speed(0)
# Shear the shape by -45 degrees and half its width
t.shearfactor(-1, -0.5)
# Rotate the shape by 30 degrees clockwise
t.shapetransform(cos(30), sin(30))
# Use a for loop to draw each side of the square with a length of 100 pixels
for i in range(4):
t.forward(100)
# Turn left after drawing each side
t.left(90)
# Reset the shearfactor and shapetransform to their defaults for the next iteration
t.shearfactor(0, 0)
t.shapetransform(1, 0)
# Call the draw_square function repeatedly to create an animation effect
for i in range(5):
draw_square()
# Wait for user input before closing the window
t.done()
In this example, we’re using `shearfactor()` and `shapetransform()` to apply a transformation to the shape being drawn by our turtle. The `cos()` and `sin()` functions are used to calculate the rotation values based on the angle of 30 degrees clockwise.
The output will look something like this:

Now, let’s take it up a notch and create an even more badass turtle shape transformation using the `get_shapepoly()` method to get the current shape being drawn by our little green friend:
# Import the turtle module and the math module
import turtle as t
from math import sin, cos
# Set up our window size and background color
t.setup(width=800, height=600)
t.bgcolor('black')
# Define a function to draw a square with some transformation applied
def draw_square():
# Set the turtle's speed to the fastest for smoother animation
t.speed(0)
# Get the current shape being drawn by our turtle and store it in a list
poly = []
while True:
# Get the turtle's current position and heading
x, y = t.pos()
angle = t.heading()
# Check if the list of points is empty or if the angle between the current and previous point is greater than 5 degrees
if len(poly) == 0 or abs(angle - poly[-1][2]) > 5:
# Append the current position and heading to our list of points
poly.append((x, y, angle))
# Calculate the center point of the square being drawn by our turtle
x_center = (poly[0][0] + poly[-1][0]) / 2
y_center = (poly[0][1] + poly[-1][1]) / 2
# Define a new function to draw the transformed square using our stored points
def transform_square():
# Set the turtle's speed to the fastest for smoother animation
t.speed(0)
# Shear the shape by -45 degrees and half its width
t.shearfactor(-1, -0.5)
# Rotate the shape by 30 degrees clockwise
t.shapetransform(cos(30), sin(30))
# Loop through the list of points
for i in range(len(poly)):
# Get the x, y, and angle of the current point
x, y, angle = poly[i]
# Calculate the transformed position and heading based on our stored points
new_x = (cos(angle) * (x - x_center)) + x_center
new_y = (-sin(angle) * (y - y_center)) + y_center
new_heading = angle + 30
# Draw the transformed point using our calculated values
t.goto(new_x, new_y)
t.seth(new_heading)
# Call the transform_square function to draw the transformed square
for i in range(5):
transform_square()
# Call the draw_square function to draw the square with transformations applied
draw_square()
# Wait for user input before closing window
t.done()
In this example, we’re using `get_shapepoly()` to get the current shape being drawn by our turtle and storing it in a list of points. We then calculate the center point of that square and use those values to transform each individual point before drawing them again with the new transformation applied.
The output will look something like this:

And there you have it, With just a few lines of code and some basic math skills, we’ve transformed our little green friend into a total badass.