to geomland.isec_lineline :l1 :l2
; 1: line1 = l1(x1,y1,x2,y2) = l1(p1,p2)
; line2 = l2(x3,y3,x4,y4) = l2(p3,p4)
; 2: x1+t(x2-x1) = x3+q(x4-x3)
; y1+t(y2-y1) = y3+q(y4-y3)
; 3: (x1-x3)+t(x2-x1) = q(x4-x3) | *(y2-y1)
; (y1-y3)+t(y2-y1) = q(y4-y3) | *(x2-x1)
; 4: (x1-x3)(y2-y1)+t(x2-x1)(y2-y1) = q(x4-x3)(y2-y1)
; (y1-y3)(x2-x1)+t(x2-x1)(y2-y1) = q(x2-x1)(y4-y3) |
; 5: (x1-x3)(y2-y1)-(y1-y3)(x2-x1) = q((x4-x3)(y2-y1)-(x2-x1)(y4-y3))
; 6: a = (x1-x3)(y2-y1)-(y1-y3)(x2-x1)
; b = (x4-x3)(y2-y1)-(y4-y3)(x2-x1)
; a = bq
; 7: (I) b<>0 => q=a/b => isec=p3+q*(p4-p3)
; (II) a=b=0 => isec=l1=l2
; (III) a<>0 b=0 => isec does not exist
make local "a (dy :l1) * (:l1.initial.x-:l2.initial.x) - (dx :l1) * (:l1.initial.y-:l2.initial.y)
make local "b (dy :l1) * (:l2.final.x -:l2.initial.x) - (dx :l1) * (:l2.final.y -:l2.initial.y)
if :b<>0 [ output :l2.initial+:a/:b * (:l2.final-:l2.initial) ]
if :a<>0 [ output set ]
output :l1
end
|