isec_lineline

Help Contents geomland Intersection isec_lineline
isec_circlepoint isec_circlecircle

geomland.isec_lineline :l1 :l2


Line-Line intersection

Definition:

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

isec_circlepoint isec_circlecircle