C# Programm: Ellipse

Ellipse - (Mathematik, programmieren, Geometrie)

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Ein interessantes Problem.

Eine einfache Lösung wäre, im wesentlichen nur die x-Koordinate der Maus auszuwerten und den zugehörigen y-Wert auf der Ellipse auszurechnen. Ob den oberen oder den unteren davon abhängig gemacht, auf welcher Seite der Hauptachse sich der Mauszeiger befindet. Bei zu großen/zu kleinen x-Werten einfach auf den Ellipsenscheitel kappen.

Die nächst kompliziertere Lösung wäre, das gleiche ausgehend vom y-Wert zu machen und von den beiden Lösungen den näherliegenden Punkt zu nehmen.

Am intuitivsten wäre wohl, immer denjenigen Ellipsenpunkt zu nehmen, der dem Mauszeiger am nächsten liegt.

Das könnte man analytisch berechnen, oder - ausgehend vom gerade gewählten Ellipsenpunkt - einen benachbarten wählen und nachsehen, ob der näher oder weiter entfernt liegt. (Dafür gibt es verschiedene verschieden komplizierte und verschieden schnelle Möglichkeiten.)

Woher ich das weiß:Hobby – Hobby, Studium, gebe Nachhilfe

WinMac98 
Beitragsersteller
 25.05.2015, 20:41

Danke für diesen Ansatz, nur noch eine Frage, hättest du eine Idee wie man die y-Koordinate am besten berechnen kann?

0
PWolff  02.06.2015, 18:49
@WinMac98

Jetzt komme ich endlich mal dazu, hier zu antworten ...

Wegen (x/a)^2 + (y/b)^2 = 1  (a und b sind die Halbachsen der Ellipse) ist

y = b * Sqrt(1 - (x/a)^2)

Ein klein wenig schneller ist

y = (b/a) * Sqrt(a^2 - x^2)

wobei man b/a und a^2 nur einmal vorher berechnen muss. Aber die Wurzel braucht sowieso am meisten Zeit.

0

Eine knifflige Frage.

Ich denke der grundsätzliche Lösungsansatz zum Überprüfen sollte mit einem if-else klar sein. Else wirft optional eine Fehlermeldung alla "Punkt nicht auf Ellipse". In den if-Block kommt deine ganze Logik zum Zeichnen der neuen Linien.

Wie überprüfst du das ganze aber? Ich habe leider keinen einfachen Befehl gefunden, von daher hätte ich eine eher umständliche Lösung. Wenn du die Ellipse zeichnest gehst du mit zwei for-Schleifen alle Punkte in dem Rectangle ab und guckst, ob sie die Randfarbe der Ellipse besitzen. Wenn ja, fügst du sie in ein Array oder in eine Liste. Die eigentliche Abfrage gestaltest du durch eine Funktion, die einen Punkt übergeben bekommt und diesen in dem Array / Liste sucht.

Ich hoffe, ich konnte dir helfen!