Maus über einer Strecke
-
Hallo,
ja mein Problem ist eigentlich nen standart Problemen, komischer weise konnte ich darüber aber nichts finden.
Ich hab eine Linie (CPoint p1, CPoint p2). Nun möchte ich wissen, ob meine Maus (CPoint maus) über der Linie ist.
Ich habe noch irgentwie in Errinerung, dass es dafür eine Formal gibt.
Würde natürlich auch mit der Allgemeinen Linien-Gleichung ( y = m * x + b ) gehen, dass würde aber bei vielen Linien zu performance problemen kommen.Also jemand ne Ahnung wie man die "Kollision" einfach errechnen kann? Gibt es dafür vleicht schon eine Funktion?
Bin wie immer über jede Hilfe dankbar.
Gruß Stu
-
vielleicht könnteste deine beiden 'CPoints' zu einer linien-klasse kombinieren und eine sognannte 'region' dazu, die auf der linie liegt. dann könnteste mit 'PtInRegion' erkennen, ob die mouse da drin ist.
...ist nur so'ne idee. kann gut sein, dass es eine einfachere lösung gibt...
-
Ich würde zuerst gucken, welche Farbe der Pixel unter der Maus hat (sofern du eine definierte Hintergrundfarbe hast).
Dann weißt du schon mal, ob du dich über dem Hintergrund oder was anderem befindest.
-
Ah mit doch noch eine gute Lösung mit der Liniengleichung eingefallen.
Setzt man einen Punkte in die Liniengleichung ein, und bekommt im ergebniss x = y raus, dann ist der Punkt auf der Linie.
Hab dann auch direckt mal eine FUnktion geschrieben:
bool LineCol(CPoint start, CPoint end, CPoint pOnLine) { double y = 0, x = 0, m = 0, b = 0; m = (double) (end.y - start.y) / (double) ( end.x - start.y); b = (double) start.y - ( m * (double) start.x ); y = pOnLine.y; x = m * (double) pOnLine.x + b; return x == y; }
-
Und wie kann ich prüfen ob eine Linie auf einer Linie liegt?
-
Was genau meinst du mit "ob eine Linie auf einer Linie liegt"?
Wenn die Linien sich irgendwo kreuzen sollen, kannst du ja ihren Schnittpunkt ausrechnen und nachsehen, ob er für beide Linien zwischen den Endpunkten liegt.
Wenn die Linien dierekt übereinanderliegen sollen, prüf einfach nach, ob beide Endpunkte von Linie2 auf Linie1 liegen (oder umgekehrt).