Hi, ich bastle gerade an einer Menü Klasse für meine Spiele, dabei bin ich jetzt bei einem Polygon Button angekommen. Ich weis jetzt leider nicht wie ich bei einem Polygon auf Klicks prüfen kann. Bis jetzt bin ich dabei den Punkt den ich habe über eine Strecke des Polygons zu spiegeln und den neuen Punkt nochmals nach hinten zu verschieben, so dass er nicht im Polygon liegen kann. Meine Überlegung war jetzt, das wenn er im Polygon liegt er immer nur eine ungerade Zahl an linien schneidet, wenn nicht eine gerade. Hat jemand eine bessere Idee, Color-Picking kann ich leider nicht verwenden, da die Prüfung eventuell in einem extra Thread läuft, mit kann auch die Idee es in einer normalen Bitmap zu zeichnen, ich weis allerdings nicht ob das schneller ist.
Ok, mangels Angaben deinerseits muss ich einige Annahmen treffen: 1. Wir rendern hier von 2D, also nicht irgendwelche im Raum schwebenden 3D-Buttons. 2. Deine Buttons sind nicht einfach Quader...in dem Fall würdest du wohl nicht fragen den das ist trivial. (Einfach min/max des Buttons mit dem Punkt vergleichen)
Also deine Idee mit dem Strahl ist gar nicht so schlecht. Allerdings musst du da nichts spiegeln und nochmals nach hinten verschieben, was immer du damit meinst
Nehmen wir an dein Punkt, also der Cursor ist gegeben als (CX, CY). Jetzt betrachten wir den Strahl von diesem Punkt aus in Richtung (0, 1), also nach oben (oder unten...völlig egal). Jetzt berechnest du die Schnittpunkte aller Kanten deines Polygons mit diesem Strahl. Bei einer ungeraden Anzahl Schnittpunkte befindest du dich innerhalb, sonst außerhalb.
Edit: Alternativ kannst du dein Polygon auch in Dreiecke aufteilen und dann diese Funktion benutzen:
Code:
/** checks if point P is inside triangle ABC. */ template<class T> inline bool pointInTriangle2D(const Vector2<T>& A, const Vector2<T>& B, const Vector2<T>& C, const Vector2<T>& P) { Vector2<T> AB = B - A; Vector2<T> BC = C - B; Vector2<T> CA = A - C; // %-Operator is 2D cross product, *-Operator is 2D dot product bool inside = (AB % CA)*(AB % (P-A)) <= 0; inside &= (BC % AB)*(BC % (P-B)) <= 0; inside &= (CA % BC)*(CA % (P-C)) <= 0; return inside; }
_________________ Yeah!
Zuletzt geändert von Coolcat am So Apr 11, 2010 20:09, insgesamt 2-mal geändert.
@Flash:Ok, den Thread hatte ich übersehen. Ich überdenke dann nochmal meine Variante. @Coolcat: Das meinte ich, ich hatte nur vor statt einer Geraden eine Strecke zu benutzen
Mitglieder in diesem Forum: 0 Mitglieder und 14 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.