Announcement

Collapse
No announcement yet.

Ermitteln ob Linie geklickt wurde

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Ermitteln ob Linie geklickt wurde

    Hallo zusammen,

    ich habe mittels 2 Punkten (x,y) und der Polyline-Funktion eine Linie gezeichnet. Nun möchte ich gerne ermitteln, wenn der Anwender mit der Maustaste geklickt hat (erstmal egal ob linke oder rechte), ob der Mausklick auf der Linie war oder nicht (am besten noch mit einem Puffer von ca. 10 Pixel). Kann mir jemand sagen wie dazu der Algorithmus aussieht?

    Danke.

    Gruß
    Uwe

  • #2
    Hallo Uwe,

    probier's so (vielleicht nicht optimal, sollte aber funktionieren):

    <PRE>
    function PtOnLine(P, P1,P2:TPoint; tol:integer) : boolean;
    // Linie verbindet P1 und P2. Prüfung, ob P auf dieser Linie
    // liegt. tol = Toleranz
    var
    tmp : double;
    begin
    result := false;
    // vertikale Linie
    if abs(P2.x-P1.x)=0 then
    result := abs(P.x-P1.x) <= tol
    else
    // horizontale Linie
    if abs(P2.y-P1.y)=0 then
    result := abs(P.y-P1.y) <= tol
    else
    // "flache" Linie (Neigung <45°)
    if abs(P2.x - P1.x) > abs(P2.y - P1.y) then begin
    tmp := (P2.y-P1.y)/(P2.x-P1.x);
    result := (abs(P.Y-round(tmp*(P.x-P1.x-tol) + P1.y))<=tol)
    or (abs(P.Y - round(tmp*(P.x-P1.x+tol) + P1.Y))<=tol);
    end else begin
    // "steile Linie (Neigung >45°)
    tmp := (P2.x-P1.x)/(P2.y-P1.y);
    result := (abs(P.x-round(tmp*(P.y-P1.y-tol) + P1.x))<=tol)
    or (abs(P.x - round(tmp*(P.y-P1.y+tol) + P1.x))<=tol);
    end;
    end;
    </PRE&gt

    Comment


    • #3
      Hallo Werner,

      vielen Dank, funktioniert prima!!

      Grüsse
      Uw

      Comment

      Working...
      X