Einzelnen Beitrag anzeigen

Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Prüfen ob Punkt auf Linie

  Alt 21. Feb 2010, 12:53
Hier sind meine Überlegungen zum Thema.
Die erste Funktion ist fürs performante und direkte Prüfen - ob sich ein Punkt auf der Linie befindet - gedacht.
Die zweite Funktion berücksichtigt auch die Dicke einer Linie, die beliebig gesetzt werden kann.

Delphi-Quellcode:
function PointOnLine( LineStart, LineEnd, LinePoint: TPoint ): Boolean; overload;
var
    v: Single;
begin
    Result := False;
    // Verschiebe Line zum Ursprung und passe Punkt an
    LineEnd := Point( LineEnd.X - LineStart.X, LineEnd.Y - LineStart.Y );
    LinePoint := Point( LinePoint.X - LineStart.X, LinePoint.Y - LineStart.Y );
    // wenn Punkt.X <= LineEnd.X, kann sie auf der Linie liegen
    if LinePoint.X > LineEnd.X then
        Exit;
    // Da der Punkt auf der Linie liegt, muss sie ein vielfaches des
    // Richtungsvektors vek(linestart-lineends) sein
    v := LinePoint.X / LineEnd.X;
    if LinePoint.Y / LineEnd.Y <> v then
        Exit;
    Result := True;
end;

function PointOnLine( LineStart, LineEnd, LinePoint: TPoint; Thickness: Single ): Boolean; overload;
var
    kX, y: Single;
begin
    Result := False;
    // Verschiebe Line zum Ursprung und passe Punkt an
    LineEnd := Point( LineEnd.X - LineStart.X, LineEnd.Y - LineStart.Y );
    LinePoint := Point( LinePoint.X - LineStart.X, LinePoint.Y - LineStart.Y );
    // wenn Punkt.X <= LineEnd.X, kann sie auf der Linie liegen
    if LinePoint.X > LineEnd.X then
        Exit;
    // berechne die Steigung der Funktion und ermittle den y wert an der Stelle LinePoint.X
    kX := LineEnd.Y / LineEnd.X;
    y := kX * LinePoint.X;
    // Prüfe, ob die Differenz < Thickness ist
    if Abs( LinePoint.Y - y ) > Thickness then
        Exit;
    Result := True;
end;
Edit: Ich habe nicht ausgiebig getestet, ob die beiden Routinen auch 100%ig fehlerfrei funktionieren.

MfG
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat