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.Copyright 2007 Victor Nekrasov