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