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


FUNCTION sign (r : real) : integer;
{ Returns 1 if r>0, 0 if r=0 or -1 if r<0 }
BEGIN
  IF r > epsilon
  THEN
     sign := 1
  ELSE
     IF r < -epsilon
     THEN
        sign := -1
     ELSE
        sign := 0;
END;

FUNCTION orient (p1, p2, p3 : vector2) : integer;
{ Returns the orientation of the polygon with consecutive vertices
  p1, p2 and p3. -1 -> Clockwise orientation
                 +1 -> Anticlockwise orientation
                  0 -> Degenerate, i.e. Line or Point }
VAR d1, d2 : vector2;
BEGIN
  d1.x := p2.x - p1.x; d1.y := p2.y -p1.y;
  d2.x := p3.x - p2.x; d2.y := p3.y -p2.y;
  orient := sign(d1.x*d2.y - d1.y*d2.x);
END;

{
You can use this routine to determine if the vertices of a
two-dimensional polygon are oriented clockwise or
anti-clockwise. If the orientation is wrong you can invert
the order of the points, and there you go ...

The corresponding routine for 3-D is as follows ...
}

PROCEDURE vectorproduct (p,q : vector3; VAR v : vector3);
{ Calculates the vector (cross) product of two vectors p and q }
BEGIN
   v.x := p.y*q.z - p.z*q.y;
   v.y := p.z*q.x - p.x*q.z;
   v.z := p.x*q.y - p.y*q.x;
END;

FUNCTION dot3 (v1, v2 : vector3) : REAL;
BEGIN
   dot3 := v1.x*v2.x + v1.y*v2.y + v1.z*v2.z;
END;

FUNCTION orient3 (p1, p2, p3, e : vector3) : integer;
{ Returns the orientation of the polygon with consecutive vertices
  p1, p2 and p3, as viewed from position 'e'
      -1 : Clockwise
      +1 : Anti-clockwise
       0 : Degenerate - Line or Point }
VAR d1, d2, d1xd2, v : vector3;
BEGIN
   d1.x := p2.x - p1.x; d1.y := p2.y - p1.y; d1.z := p2.z - p1.z;
   d2.x := p3.x - p2.x; d2.y := p3.y - p2.y; d2.z := p3.z - p2.z;
   vectorproduct (d1, d2, d1xd2);
   v.x := e.x - p1.x; v.y := e.y - p1.y; v.z := e.z - p1.z;
   orient3 := sign(dot3(d1xd2, v));
END;

{ You will probably need the following definitions as well :- }

TYPE vector2 = RECORD
        x, y : real;
     END;

     vector3 = RECORD
        x, y, z : real;
     END;

CONST epsilon = 0.00001;


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