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