[Back to GRAPHICS SWAG index]  [Back to Main SWAG index]  [Original]

{
FROM:	Paul R. Santa-Maria 71674,422, 71674,422
TO:	Gayle Davis, 72067,2726
DATE:	1/16/95 10:47 PM
Re:	SWAG submission (GRAPHICS)

{The algorithm of this line intersection routine is based on vector
cross products of the line endpoints.  The recursion is only one level 
deep, to handle a specific degenerate case (collinear lines).  If the 
degenerate case is detected, it nudges one end of one line and looks 
to see if the intersection criterion is still fulfilled.  If not, it 
nudges the other end and tries again.--Steve Schafer [CIS 76711,522]}
 
  function INTERSECT(L1X1, L1Y1, L1X2, L1Y2,
                     L2X1, L2Y1, L2X2, L2Y2 : LongInt) : Boolean;
  var
    Z1, Z2, Z3, Z4 : LongInt;
  begin
    Z1 := L1X1*(L2Y2-L2Y1)+L2X2*(L2Y1-L1Y1)+L2X1*(L1Y1-L2Y2);
    Z2 := L2X1*(L1Y1-L1Y2)+L1X1*(L1Y2-L2Y1)+L1X2*(L2Y1-L1Y1);
    Z3 := L1X2*(L2Y1-L2Y2)+L2X1*(L2Y2-L1Y2)+L2X2*(L1Y2-L2Y1);
    Z4 := L2X2*(L1Y2-L1Y1)+L1X2*(L1Y1-L2Y2)+L1X1*(L2Y2-L1Y2);
    if (Z1 = 0) and (Z2 = 0) and (Z3 = 0) and (Z4 = 0) then
      INTERSECT := (INTERSECT(L1X1, L1Y1, L1X2, L1Y2, L2X1, L2Y1, 
                              L2X1+L2Y2-L2Y1, L2Y1+L2X1-L2X2) or 
                    INTERSECT(L1X1, L1Y1, L1X2, L1Y2, L2X2+L2Y2-L2Y1,
                              L2Y2+L2X1-L2X2, L2X2, L2Y2))
    else if (((Z1 >= 0) and (Z2 >= 0) and (Z3 >= 0) and (Z4 >= 0)) or
             ((Z1 <= 0) and (Z2 <= 0) and (Z3 <= 0) and (Z4 <= 0))) then
      INTERSECT := True
    else
      INTERSECT := False;
  end;
 


[Back to GRAPHICS SWAG index]  [Back to Main SWAG index]  [Original]