# Koordinaten von einem Kreissegment berechnen



## duke (21. Feb 2009)

Hallo zusammen, 

folgendes Problem:
- Ich habe einen Kreis gezwichnet, der aus 4 einzelnen Segmenten zusammen gesetzt ist.
- Ich habe einen MouseAdpater, der mir die Koordinaten eines ClickEvents liefert.

Nun möchte ich den ClickPoint mit den Koordinaten des Kreissegments vergleichen, d.h. ich möchte wissen auf welches Kreissegment gecklickt wurde.

Meine Frage: Den Radius meines Segments berechne ich mit r= (4h²+s²) / 8h. Wie kann ich den Vergleich durchführen, ohne dass alle Koordinaten gespeichert werden müssen, d.h. rechnerisch gelöst?

Alternativ:

Vielleicht denke ich auch zu kompliziert und es gibt eine deutlich einfachere Lösung.


Viele Grüße


----------



## Mostly_Harmless (21. Feb 2009)

Also falls die Grenzen der Segmente horizontal und vertikal verlaufen (s. Anhang), ist es ganz leicht, das Segment herauszufinden:

Du vergleichst die Koordinaten des Kreismittelpunktes mit denen des Mauszeigers.
Ist die x-Koordinate des MouseEvents größer, ist es eines der Segmente auf der rechten Seite, ansonsten eines auf der linken.
Anschließend folgt noch der Vergleich der y-Koordinaten.


----------



## hdi (21. Feb 2009)

Ja und dann musst du natürlich noch prüfen, ob die Werte nicht den 
kompletten Radius sprengen, also zuweit rechts/links/oben/unten liegen.

Einfach if(<= radius)


----------



## duke (21. Feb 2009)

Gibt es auch eine Lösung, mit der ich direkt das gezeichnete Kreissegment abfrage. In der Lösung von Euch würde ich das Segment erkennen, auch wenn ausserhalb des gezeichneten Kreises geklickt wird, z.Bsp. zwischen Kreissegmentlinie und Mittelpunkt.


----------



## Mostly_Harmless (21. Feb 2009)

duke hat gesagt.:


> In der Lösung von Euch würde ich das Segment erkennen, auch wenn ausserhalb des gezeichneten Kreises geklickt wird



Daher die Ergänzung von hdi, dass der Abstand zum Kreismittelpunkt <= dem Radius des Kreises sein muss.

Falls du das jetzt nicht meintest, versteh ich deine Frage nicht, zeig dein Problem am besten mal mit Hilfe eines Bildes.


----------



## duke (23. Feb 2009)

Hallo!

Tatsächlich habe ich zunächst die Lösung nicht ganz verstanden.......ich stehe total auf dem Schlauch und weiss auch nicht warum.

Die Erkennung, ob innerhalb oder ausserhalb geklickt wird, funktioniert. Ich habe ein großes Problem mit den Randbereichen.
Es soll möglich sein, dass bei Klick genau erkannt wird, um welches Segment es sich handelt (links, oben, rechts).
Da habe ich (wie an dem markierten Bereich) ein Problem.

Der Winkel an den Stosskanten bereitet mir Probleme bei der Lösung.


----------



## Marco13 (23. Feb 2009)

Eine ganz andere Möglichkeit, bei der der aufgemalte Fall abgedeckt wäre: Wenn der Kreismittelpunkt bei (x0,y0) ist, und man bei (x1,y1) hinklickt, kann man mit
int dx = x1-x0;
int dy = y1-y0;
float angle = (float)Math.atan2(dx,dy);
den Winkel ausrechnen, "wo" der geklickte Punkte bzgl. des Millepunktes liegt (siehe http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html#atan2(double, double) ). Man bekommt damit einen Winkel raus, bei dem man nurnoch testen muss, ob
-45° < winkel <= 45° : Rechtes Segment
45° < winkel <= 135° : Unteres Segment
...usw...
(ACHTUNG: Der Zurückgegebene Winkel ist in Radians - ggf. mit Math.toDegree in Grad umrechnen (auch wenn Andrey mich dafür haut...))


----------

