--
Message: 2 Date: Mon, 26 Jan 2004 06:57:50 -0500 From: Jim Lyons <[EMAIL PROTECTED]> Subject: Re: geometry-challenged To: [EMAIL PROTECTED] Message-ID: <[EMAIL PROTECTED]> Content-Type: text/plain; charset=US-ASCII; format=flowed
Jim Hurley wrote in part:
I'm not sure if this helps, but the function "intersection" below will return the intersection of any two lines. ...
function intersection p1,p2,pp1,pp2 ...
return x & comma & y end intersection
Someone already pointed out that this function as written still allows one divide by zero case.
Jim
Check. I think the following handler takes care of the infinity.
One practical way to deal with the parallel lines case is to make them converge to a point at a very great distance--see below. Or, of course, you could return a "Lines parallel" message.
function intersection p1,p2,pp1,pp2
get the paramcount
if it is 1 then
put item 4 of p1 into pp2
put item 3 of p1 into pp1
put item 2 of p1 into p2
put item 1 of p1 into p1
end if
put item 1 of p1 into x1
put item 2 of p1 into y1
put item 1 of p2 into x2
put item 2 of p2 into y2
put item 1 of pp1 into xp1
put item 2 of pp1 into yp1
put item 1 of pp2 into xp2
put item 2 of pp2 into yp2
--Check if the lines are parallel and deal with it somehow
if (y2-y1)*(xp2-xp1) = (yp2-yp1)*(x2-x1) then add .0000001 to x2
if x1 = x2 or xp1 = xp2 then
if x2 = x1 then
return x1&comma&yp2 + (x1-xp2)*(yp2-yp1)/(xp2-xp1)
else
return xp2&comma& y2 + (xp1-x2)*(y2-y1)/(x2-x1)
end if
end if
put yp2 - y2 + x2*(y2-y1)/(x2 - x1) - xp2*(yp2 - yp1)/(xp2 - xp1) into numerator
put ((y2 - y1)/(x2 - x1) -(yp2 - yp1)/(xp2-xp1)) into denom
put numerator / denom into x
put y2 + (x-x2) *(y2-y1)/(x2-x1) into y
return x & comma & y
end intersection
Jim _______________________________________________ use-revolution mailing list [EMAIL PROTECTED] http://lists.runrev.com/mailman/listinfo/use-revolution
