ISCLOCKWISE.PAS

unit IsClockWise;

interface

implementation

/// Алгоритм определения направления перечисления вершин полигона ( к сожалению не точный)
Function IsClockWise(P:TPolygon):Boolean;
Var i  : Integer;
    e  : T2DEdge;
    et : TPos;
    pt : T2DPoint;
Begin
  Result := True;
  et :=BETWEEN;
  // найти точку слева или справа от ребра
  For i:=0 To P.size-1 Do Begin
    e := p._Edge;
    If (E.org.Y<>E.dest.Y) Then Begin //
      pt.x := (E.org.X+E.dest.x)/2+0.1;// середина отрезка и еще 0.1<-(здесь как раз не точность)
      pt.y := (E.org.y+E.dest.Y)/2;
      et := __classifyE(pt,E);
      Break;
    End;
    P.advance(CLOCKWISE);
  End;

  If _pointInPolygon(pt,P)=INSIDE Then Begin
    Case et of
      RIGHT:Result := True;// если точка внутри полигона и справа, то закрутка по часовой стрелке CLOCKWISE
      LEFT :Result := False; // если точка внутри полигона и слева, то закрутка против часовой стрелки COUNTER_CLOCKWISE
    End;//Case
  End Else Begin
    Case et of
      LEFT :Result := True; // если точка снаружи полигона и слева, то закрутка по часовой стрелки CLOCKWISE
      RIGHT:Result := False;// если точка снаружи полигона и справа, то закрутка против часовой стрелки COUNTER_CLOCKWISE
    End;//Case
  End;
End;

end.

Generated by PasToWeb, a tool by Marco Cantù.

Copyright 2007 Victor Nekrasov 1