Как определить лежит ли точка внутри полигона?

The main procedure is called ExploreLine. In this procedure Fst and Lst may be two consecutively points in the polyline. Srch is the point searched.

{ ... }

const {global}

 BigM = 1000000;

function Pend(Pi, Pf: TPoint): Real;

begin

 if (Pf.X = Pi.X) then

  Result := BigM {for a vertical line}

 else

  Result := (Pf.Y - Pi.Y) / (Pf.X - Pi.X);

end;

function Dist(Pi, Pf: TPoint): Real;

begin

 Result := sqrt(sqr(Pi.Y - Pf.Y) + sqr(Pi.X - Pf.X))

end;

function CalcPoint(Pi, Pf: TPoint; d: Word): TPoint;

var

 k, m: Real; { k=d / (1 + m2)Ѕ }

begin

 m := Pend(Pi, Pf);

 k := d / (Sqrt(1 + Sqr(m)));

 if ((Pf.X - Pi.X) < 0) then

 begin

  Result.X := Pi.X - Round(k);

  Result.Y := Pi.Y - Round(m * k);

 end

 else

 begin

  Result.X := Pi.X + Round(k);

  Result.Y := Pi.Y + Round(m * k);

 end;

end;

function ExploreLine(Srch, Fst, Lst: TPoint): Boolean;

var

 p: Word;

 Any: TPoint;

 lim, dis: Real;

begin

 lim := Dist(Lst, Fst);

 p := 1;

 Any := Fst;

 repeat

  Result := TestPoint(Srch, Any);

  dis := Dist(Any, Fst);

  Any := CalcPoint(Fst, Lst, Rad * p);

  Inc(p);

 until

  (Result)rr(dis >= lim);

end;

Взято с Delphi Knowledge Base: http://www.baltsoft.com/

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...