Announcement

Collapse
No announcement yet.

Punkt einer diagonalen Linie berechnen, aber wie?

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

  • Punkt einer diagonalen Linie berechnen, aber wie?

    Hallo zusammen,

    ich habe ein Object, welches eine Linie auf einem beliebigen Canvas Object zeichnet.

    Nun möchte Ich beim Mausclick auswerten, ob ich auf die Linie geclickt habe. Bei horinzontalen oder vertikalen Linien wäre das ja eigentlich auch kein großes Problem.

    Aber wie bereche ich dies bei einer Diagonalen Linie.

    Gibt es da eine spezielle Formel für, und kann mir die jemand nennen, oder mir sagen, wo ich das nachlesen kann?

    Viele Grüße,
    Christian

    P.S. Ich benutze den Borland C++ Builder 6

  • #2
    Hallo

    1. Pruefen, ob die X-Koordinate des Mauspunkts innherhalb der beiden Endpunkte der Linie liegen.
    2. für die Linie den Winkel zur X-Achse berechnen.
    3. für eine gedachte Linie vom Anfangspunkt der Linie 1 bis zum Mauspunkt den Winkel berechen.
    4. Sind die Winkel gleich (runden), dann liegt der Mauspunkt auf der Linie

    Gruß Ud

    Comment


    • #3
      Besser geht es mit <b>LineDDA</b> auf der WinAPI. Damit kann man ermitteln, welche Punkte Windows für eine Linie zeichnen würde. Absolut zuverlässig.<p>
      Schöne Grüße, Mario Noac
      Schöne Grüße, Mario

      Comment


      • #4
        Versuch es doch mal mit dem Satz des Pythagoras: aquadrate= bequadrat + cequadrat, wurzelaus aquadrat undsoweiter...:

        Comment


        • #5
          Die Formel dazu stammt aus der analytischen Geometrie:

          Y = m * X + b

          m ist der Tangens des Steigungswinkels der Geraden

          b ist der Y - Wert, bei dem die Gerade die Y - Achse schneidet, also bei X = 0.

          X ist die Mausposition in X - Richtung

          Wenn Y der Mausposition in Y - Richtung entspricht, liegt der Punkt genau auf der Geraden
          Günther

          Comment


          • #6
            Das ist die Lösung:
            Man nimmt die X- und Y- Koordinaten des Endpunktes der Ausgangslinie zur Berechnung des Tangens am Endpunkt (als Ausgangspunkt nehme ich Null an. Falls nicht, muß man zuerst die Koordinaten des Ausgangspunktes vom Endpunkt abziehen, also auf 0 zurückrechnen). Wenn man die Koordinaten des zweiten Punktes hat, berechnet man ebenfalls dessen Tangens. Wenn beiden Tangenten gleich sind, liegt der Punkt auf der Linie:

            Notwendige Bedingung: X1/Y1 = X2/Y2.

            Was lange währt, wird endlich gut..

            Comment


            • #7
              Hallo Andreas,

              könntest Du mir vielleicht den Quellcode deiner Routine zur Verfügung stellen? Bräuchte genau so etwas, allerdings in Delphi.

              Wäre toll!

              Gruß
              Uw

              Comment


              • #8
                Hallo,
                ich habe mal eine Methode rausgekramt mit der
                man noch eine Toleranz (hier Genauigkeit) mitgeben kann.
                Für den Fall das man mit der Maus nicht genau das
                Pixel auf der Linie trifft.
                <pre>
                void CLinie::ClickLinie(float kx,float ky,float genauigkeit){

                float y = get_m()*kx + get_n();
                float x;
                if( (get_m() != 0) && (p1->get_x() != p2->get_x()))
                x = (ky - get_n())/get_m();
                else
                x = p1->get_x();
                float d1 = ((ky-y)>0)?(ky-y)ky-y)*-1;
                float d2 = ((kx-x)>0)?(kx-x)kx-x)*-1;
                float minx = min(p1->get_x(),p2->get_x());
                float maxx = max(p1->get_x(),p2->get_x());
                float miny = min(p1->get_y(),p2->get_y());
                float maxy = max(p1->get_y(),p2->get_y());
                if( ((d1 <= genauigkeit)||(d2<=genauigkeit)) && ( ((kx >= minx) && (kx <= maxx))
                || ( (ky >= miny) && (ky <= maxy))) ){
                // Linie wurde getroffen
                }
                }
                </pre>
                Die Methode get_m() liefert den Anstieg und get_n() den
                Schnittpunkt mit der y-Achse.
                <pre>
                float CLinie::get_m(){
                if(p1->get_x() == p2->get_x())
                return 0;
                else
                return (float)((p2->get_y()-p1->get_y()) / (p2->get_x() - p1->get_x()));
                }

                float CLinie::get_n(){
                return (p2->get_x() == p1->get_x())?0(p1->get_y()*p2->get_x()) - (p2->get_y() * p1->get_x())) / (p2->get_x() - p1->get_x());
                }
                </pre>
                mf

                Comment

                Working...
                X