Punkt in beliebigem Oval?
-
Ich habe ein Oval, das im Koordinatensystem lustigerweise durch die linke obere und die rechte untere Ecke begrenzt ist (Java: Graphics.drawOval()) und möchte nun errechnen, ob sich ein Punkt(x,y) innerhalb dieses Ovals befindet. JAva kennt hierfür scheinbar keine Funktionen, also muss ich mir selbst behelfen.
Aus den bekannten Werten kann ich die Höhe und die Breite eines Ovals errechnen.
Wie mach ich jetzt weiter?
-
Graphics.drawOval().getShapeOfOperation().contains(x,y)
-
Auch wenn damit Deine Frage vermutlich schon beantwortet ist, noch ein mathematischer Lösungsweg:
Wir nehman an die Breite sei b und die Höhe a. Der Punkt (x,y) soll getestet werden. Wir können natürlich annehmen, dass das Oval im Zentrum den Ursprung hat, indem wir alles geeignet verschieben. Nun skalieren wir alles, bis Höhe und Breite des Ovals gleich sind:
Skalieren wir etwa die x-Richtung mit Faktor a/b, so ergibt sich ein Kreis mit Durchmesser a. Aus dem Anfragepunkt wird (a/b*x,y). Den müssen wir nun testen. Das geht im Kreis aber einfach: Er ist enthalten genau dann wenn (a/b*x)^2 + y^2 <= (a/2)^2
umgeformt: 4*(a2*x2+b2*y^2) <= a2*b2
(Sofern ich mich nicht verrechnet habe. ;))
Das lässt sich nun einfach überprüfen.
Was anderes wird die Java-Methode vermutlich auch nicht tun.
-
Ajaw schrieb:
Graphics.drawOval().getShapeOfOperation().contains(x,y)
in welcher Version? bei mir tut's des nich..
-
@Jester: Du redest von einer Ellipse. Ovale sind aber nicht immer Ellipsen. Ich merke aber gerade, dass ich garnicht weiß, wie man Ovale durch Formeln darstellt.
-
Stimmt, ich ging davon aus, dass er von Ellipsen spricht.
Ein Blick auf http://de.wikipedia.org/wiki/Oval_(Geometrie) verrät dass ein Oval was allgemeineres ist... allerdings soviel allgemeiner, dass ich nicht glaube, dass es sich bei dieser Fragestellung darum dreht.
-
Da stimme ich zu
-
drawOval(int x, int y, int width, int height)
heisst zwar drawOval, die signatur legt aber verdammt nahe, dass es sich um eine ellipse handelt.
und ich würd statt eines Graphics objekts ein Graphics2D nehmen und dessen draw(Shape s) methode. dafür lässt sich dann ein Ellipsis2D objekt verwenden und - tada - das hat eine contains(x, y) methode