from turtle import * from superturtle import * from superturtle.movement import * segment_positions = [] def draw_web_line(side_length): global segment_positions fly(-350, 350) for side in range(5): draw_segmented_line(side_length) right(22.5) fly(-350, 350) #right(22.5) def draw_segmented_line(side_length): "Draws a line with 4 equal segments and marks the points" segment_length = side_length / 4 line_segments = [] for segment in range(4): forward(segment_length) mark_point() # Mark the points at each segment line_segments.append(pos()) segment_positions.append(line_segments) def mark_point(): "Marks a point at the current location" dot(5, "black") # Draw a dot to mark the segment points def connect_segments(): "Connects the corresponding segment points of adjacent lines" global segment_positions for i in range(4): # Iterate over the 4 segments for j in range(5): # Iterate over the 5 lines next_j = (j + 1) % 5 # To wrap around to the first line after the fifth # Skip connections if either segment is near the x-axis or y-axis if segment_positions[j][i][0] == -350 or segment_positions[next_j][i][1] == 350: continue penup() goto(segment_positions[j][i]) # Go to the current segment pendown() goto(segment_positions[next_j][i]) # Draw a line to the next segment # Main function to draw the web def draw_web(side_length): draw_web_line(side_length) connect_segments() # Draw the web lines # draw_web(300) # hideturtle() # done() def draw_circle(radius, x, y, color=None): "Draw a circle with the given radius at the (x, y) position. Optionally fill with color." penup() goto(x, y - radius) # Move to the correct start point pendown() if color: fillcolor(color) # Set the fill color begin_fill() # Start filling the circle with color circle(radius) # Draw the circle if color: end_fill() # End the filling def draw_spider(): # Step 1: Draw the big circle (spider body) on top of the small circle draw_circle(60, 30, 60, color="grey") # Step 2: Draw the small circle (spider head) draw_circle(30, 30, 0, color="black") # Step 3: Draw legs on big circle draw_legs(60, 30, 60) def draw_legs(radius, x, y): "Draws legs starting from the perimeter of the big circle (spider's body)" leg_length = 50 # Length of the legs pensize(4) # Draw legs at equal angles from the top of the big circle angles = [-60, -30, 0, 30, 150, 180, 210, 240] # Angles for legs (top-left, top-right, and bottom) for angle in angles: penup() goto(x, y) # Go to the center of the big circle setheading(angle) # Set the heading to the desired angle forward(radius) # Move forward to the perimeter of the big circle pendown() forward(leg_length) # Draw the leg penup() backward(leg_length) # Move back to the perimeter of the big circle def draw_connection_line(): "Draw a line from the top of the big circle (head) to the center of the small circle (body)" penup() goto(30, 400) pendown() goto(30, 120) # Draw a line to the center of the small circle (spider's body) penup() goto(0, 0) def drawing(side_length): draw_web(side_length) penup() goto(0, 0) setheading(0) pendown() draw_spider() draw_connection_line() hideturtle() done() drawing(300)