0

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!

KSmith
  • 57
  • 1
  • 7
  • Is your goal to save the angles of the first triangle to variables? – KSmith Jun 17 '22 at 21:11
  • Yes, when bob is connecting the dots, he draws the lines in certain angles/degrees. I want to use these to put the l1, l2 and l3 turtles in these angles/degrees as well. So yeah, is it possible to save them to a variable? – beginnercoder Jun 17 '22 at 21:28
  • Or, I basically want to align l1, l2 and l3 with the lines of the triangles. Yes align is the right word sorry. I thought maybe I could do it this way – beginnercoder Jun 17 '22 at 21:39
  • Have you tried `.towards(x,y)` to see at what angle a point is relative to a turtles `.heading()`? Maybe look into that or you could calculate the angles yourself with the pairs of coordinates and set the headings for `l1`, `l2` and `l3`. As a last trick you could face each turtle to the next point, say `l1.towards(bob_x3, bob_y3)` and then `l1.rotate(somenumber)` to tilt in whichever direction you want – Queuebee Jun 19 '22 at 16:01

1 Answers1

0

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()
Queuebee
  • 651
  • 1
  • 6
  • 24