Mausposition in Raute
-
Guten Abend,
Ich versuche grade herauszufinden wann die Mausposition innerhalb einer Raute ist. Bei einem Rechteck ist es ja relativ simpel jedoch weiß ich nicht wie ich das in einer Raute machen soll. Mit einer Schleife jeden Punkt abfragen scheint mir etwas zu rechenaufwendig?
Würde mich über Tipps freuen
Vielen Dank
-
Mach ein Rechteck um deine Raute um erstmal zu prüfen ob die Muasposition überhaupt in der Nähe der Raute ist. Dann rechne dir die Mausposition relativ zum Rechteck um (die linke obere Ecke wäre 0,0). Mach dir nen std::vector<bool> fertig und speichere für jeden Punkt im Rechteck ob er zur Raute gehört oder nicht. Dann brauchste nurnoch in den vector zu greifen und weisst ob die Position in der Raute liegt oder nicht.
Das wäre jetzt erstmal meine Idee dazu, wenn du dein Anwendungsgebiet etwas spezifizieren würdest wäre ne genauere und evtl passendere Antwort möglich.
-
Ist das eine quadratische Raute?
Falls ja, würde ich mit einem Quadrat anfangen. Liegt der Cursor drin, würde ich schauen, in welchem Quartal der Mauscursor liegt. Jedes Quartal ist jetzt zur Hälfte Raute und zur Hälfte Nichtraute je mit Dreieck. Je nachdem, welches Quartal es ist, muss eben x<y oder x>y sein (mit x,y mit Koordinatenursprung linke obere Ecke vom Quartal).
Ist es keine quadratische Raute, sieht es genau so aus, nur dass nicht x>y oder x<y sein muss, sondern wir eben noch einen Koeffizienten k*x<y bzw. k*x>y benötigen. Den herauszufinden ist nicht schwierig, entspricht ja nur dem Seitenverhältnis des umgebenden Rechtecks.
-
Für alle 4 Kanten eine Funktion (im mathematischen Sinne ) aufstellen, Stichwort Geradengleichung. Da braucht man nur mehr die x-Koordinate in die Funktion geben und erhält den y-Wert der Kante. Die y-Werte der 4 Kanten richtig mit dem wirklichen Wert vergleichen, schon ist man fertig.
Probleme gibts aber, wenn eine Kante nahezu oder genau senkrecht ist, da wirds kompliziert.
-
Was Senfti sagt ist fast richtig. Für jede Kante deines Polygons definierst du dir einen Halfspace (Gerade in Ebenengleichung ausgedrückt) (Umlaufsinn beachten). Damit hast du für jede Kante eine Formel, die besagt, ob du bezüglich der Kante "innerhalb" oder "ausserhalb" bist. Bist du bezüglich allen Halfspaces innerhalb, hast du gewonnen. Wenn du bezüglich einem oder mehrerer ausserhalb bist, bist du ausserhalb
-
fabsf(MausX-RauteCenterX)/Width+fabsf(MausY-RauteCenterY)/Height<0.5f
-
Danke für den Input. Ich werde mich heute mal drann setzen
-
rapso schrieb:
fabsf(MausX-RauteCenterX)/Width+fabsf(MausY-RauteCenterY)/Height<0.5f
Genial. Herleitung?
-
In Worten: der (relative) Abstand bei der Rautenumrandung zum Mittelpunkt beträgt immer 0.5.
Für die 4 Eckpunkte ist das ja ganz einfach zu zeigen, da dann ja entweder "delta X" oder "delta Y" 0 ist.
Und für die anderen Punkte auf den Außenlinien gilt dann die Dreiecksberechnung, d.h. wenn "delta X" von 0.5 an kleiner wird, so wird entsprechend "delta Y" von 0 an größer, d.h. die Summe bleibt konstant.