I'm making a program where the user can click on the screen 3 times and it makes a triangle. It will then find the middle points of those 3 lines. Next, I want it to draw 3 lines perpendicular to each of the lines that make up the triangle (through the middle points).
I'm stuck at drawing the perpendicular lines. I wanted to try to save (like you save a position or coordinates) the angles that the turtle bob
(the one that connects the lines of the triangle) makes on each line, and then put the middle line turtles (l1
, l2
, l3
) tilt in that angle. It would then make it go right and left and draw the line. I'm sorry if this is unclear, but I can't really think of another way to explain it. This is my code:
import turtle
tur = turtle.Turtle() #draws the dots
bob = turtle.Turtle() #connects the dots
l1 = turtle.Turtle() #middle point of line 1
l2 = turtle.Turtle() #middle point of line 2
l3 = turtle.Turtle() #middle point of line 3
mid = turtle.Turtle() #point where the lines cross, haven't used this one yet
screen = turtle.Screen()
screen.tracer(0,0)
screen.setup(800,800)
tur.ht()
tur.up()
tur.speed(0)
bob.ht()
bob.up()
bob.speed(0)
screen.update()
l1.up()
l2.up()
l3.up()
mid.up()
mid.ht()
dots = 1
def lines():
line()
l1.goto(line_1_mid_cords) #go to middle of lines
l1.dot()
l2.goto(line_2_mid_cords)
l2.dot()
l3.goto(line_3_mid_cords)
l3.dot()
def line():
global line_1_mid_cords, line_2_mid_cords, line_3_mid_cords
line_1_mid_cords = (( bob_x1 + bob_x2 ) /2, ( bob_y1 + bob_y2 ) /2) #get middle coordinates
line_2_mid_cords = (( bob_x2 + bob_x3 ) /2, ( bob_y2 + bob_y3 ) /2)
line_3_mid_cords = (( bob_x1 + bob_x3 ) /2, ( bob_y1 + bob_y3 ) /2)
def dotOnClick(x,y):
global dots, bob_x1, bob_y1, bob_x2, bob_y2, bob_x3, bob_y3
if dots == 1:
if x >= -800 and x <= 800 and y >= -800 and y <= 800: #click on screen
tur.goto(x,y) #go to that point
bob.goto(tur.pos())#bob goes there too
bob_x1 = bob.xcor() #saves bobs coordinates
bob_y1 = bob.ycor()
tur.dot()
bob.down()
screen.update()
dots = 2
elif dots == 2:
if x >= -800 and x <= 800 and y >= -800 and y <= 800: #when second dot is clicked
tur.goto(x,y) #both tur and bob to to that point and they get connected
bob.goto(tur.pos())
bob_x2 = bob.xcor()
bob_y2 = bob.ycor()
tur.dot() #draws second dot
bob.down()
screen.update()
dots = 3
elif dots == 3:
if x >= -800 and x <= 800 and y >= -800 and y <= 800: #same for 3rd point on screen
tur.goto(x,y)
bob.goto(tur.pos())
bob_x3 = bob.xcor()
bob_y3 = bob.ycor()
tur.dot()
bob.down()
bob.goto(bob_x1,bob_y1) #bob goes to first dot and completes the triangle
lines() #makes the turtles l1, l2, l3 go to the middle points of the triangle lines
screen.update()
dots = 4
elif dots == 4:
if x >= -800 and x <= 800 and y >= -800 and y <= 800: #resets when you click again
tur.clear()
bob.clear()
screen.update()
tur.reset()
bob.reset()
tur.ht()
tur.up()
tur.speed(0)
bob.ht()
bob.up()
bob.speed(0)
screen.update()
dots = 1
turtle.onscreenclick(dotOnClick,1,True)
If I need to explain more about what I exactly mean, please say so!
After putting your mid-point turtles in their spot, you can aim them towards the next point on the triangle.
def lines():
line()
l1.goto(line_1_mid_cords) #go to middle of lines
l1.setheading(l1.towards(bob_x2, bob_y2))
l1.dot()
l2.goto(line_2_mid_cords)
l2.setheading(l2.towards(bob_x3, bob_y3))
l2.dot()
l3.goto(line_3_mid_cords)
l3.setheading(l3.towards(bob_x1, bob_y1))
l3.dot()