Geometry in Pascal/de

From Free Pascal wiki
Revision as of 22:37, 5 July 2014 by Olaf (talk | contribs) (Created page with "{{geometry in pascal}} <br><br> __TOC__ <br /> =Testen, ob ein Punkt in einem Polygon liegt= <syntaxhighlight> // Die Funktion gibt den Wert True zurück, wenn der Punkt x,y ...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

Deutsch (de) English (en) français (fr)



Testen, ob ein Punkt in einem Polygon liegt

//  Die Funktion gibt den Wert True zurück, wenn der Punkt x,y innerhalb eines Polygons liegt.
//  Die Funktion gibt den Wert False zurück, wenn der Punkt x,y nicht in einem Polygon liegt.
//
//  Der Original C-Code: http://www.visibone.com/inpoly/inpoly.c.txt
//
//  Übersetzng von C nach Pascal: Felipe Monteiro de Carvalho
//
//  Lizenz: Public Domain

function IsPointInPolygon(AX, AY: Integer; APolygon: array of TPoint): Boolean;
var
  xnew, ynew: Cardinal;
  xold,yold: Cardinal;
  x1,y1: Cardinal;
  x2,y2: Cardinal;
  i, npoints: Integer;
  inside: Integer = 0;

begin

  Result := False;

  npoints := Length(APolygon);

  if (npoints < 3) then Exit;

  xold := APolygon[npoints-1].X;
  yold := APolygon[npoints-1].Y;

  for i := 0 to npoints - 1 do
  begin
    xnew := APolygon[i].X;
    ynew := APolygon[i].Y;

    if (xnew > xold) then
    begin
      x1:=xold;
      x2:=xnew;
      y1:=yold;
      y2:=ynew;
    end
    else
    begin
      x1:=xnew;
      x2:=xold;
      y1:=ynew;
      y2:=yold;
    end;

    if (((xnew < AX) = (AX <= xold))         // Die Ecke ist am linken Ende "offen"
      and ((AY-y1)*(x2-x1) < (y2-y1)*(AX-x1))) then
    begin
      inside := not inside;
    end;

    xold:=xnew;
    yold:=ynew;

  end;

  Result := inside <> 0;

end;