Home > Software engineering >  I'm having a problem with determining the intersection of two lines in this python code
I'm having a problem with determining the intersection of two lines in this python code

Time:09-29

I tried a math formula from analytic geometry but I didn't get the desired results.

As you can see in the code, the user draw two lines and a green circle(point of intersection) appear.

I have tried to fix the problem for hours but I failed. Sometimes the point doesn't appear or appear but in the wrong position.

from pygame import *
init()
win = display.set_mode((500,500))
lines = []
cords = []
preview = False
xi, yi = -100, -100

def drawlines(flines):
    for fcords in flines:
        draw.line(win,(0,0,0),fcords[0],fcords[1],4)

def add(a, b):
    return a[0] b[0], a[1] b[1]

def sub(a, b):
    return a[0]-b[0], a[1]-b[1]

def rot90(v):
    return -v[1], v[0]

def mul(v, s):
    return v[0]*s, v[1]*s

def dot(a, b):
    return a[0]*b[0]   a[1]*b[1]

run = True
while run:
    
    for ev in event.get():
        if ev.type == QUIT:
            run = False    
        elif ev.type == MOUSEBUTTONDOWN:
            if ev.button == 1:
                preview = True
                a = ev.pos
                cords.append(a)
        elif ev.type == MOUSEBUTTONUP:
            if ev.button == 1:
                cords.append(ev.pos)
                lines.append((cords))
                cords = []
                preview = False

    intersections = []
    for i, line1 in enumerate(lines):
        for line2 in lines[i 1:]:
            #line 1
            point1_line1, point2_line1 = line1
            line1_vector = sub(point2_line1, point1_line1)
            line1_norml  = rot90(line1_vector)
            
            #line2
            point1_line2, point2_line2 = line2
            line2_vector = sub(point2_line2, point1_line2)
            line2_norml  = rot90(line2_vector)

            # vector from start point of line 2 to start point of line 1
            l2p1_l1p1 = sub(point1_line1, point1_line2)

            # intersection
            d = dot(line2_vector, line1_norml)
            if d != 0: # prallel lines
                t = dot(l2p1_l1p1, line1_norml) / d
                u = dot(l2p1_l1p1, line2_norml) / d
                if 0 <= t <= 1 and 0 <= u <= 1: # intersection on line segments
                    xi, yi = add(point1_line2, mul(line2_vector, t))
                    intersections.append((xi, yi))

    win.fill((255,255,255))
    if len(cords) % 2 == 1:
        draw.line(win,(0,0,0), a, mouse.get_pos(), 4)
    drawlines(lines)
    for p in intersections:
        draw.circle(win, (0,200,0), (round(p[0]), round(p[1])), 10)
    display.flip()

quit()
exit()
  • Related