C# Programm: Ellipse
Hey,
ich möchte zur Übung ein Programm schreiben, bei dem ich einfach verschiedene Sachen an einer Ellipse berechnen lasse. Nun habe ich mir das so vorgestellt, dass der Benutzer auf einen Punkt X (siehe Anhang) auf der Ellipse klicken kann und diesen dann beliebig verschieben kann, sodass sich die Strecken F1-X und F2-X mit ihm verschieben. Jedoch weiß ich nicht, wie ich erreiche, dass man den Punkt nur auf der Ellipse bewegen kann, und nicht irgendwo auf dem Panel. Nun wollte ich fragen ob mir jemand von euch nicht einen kleinen Lösungsansatz Posten könnte(es muss nicht unbedingt Code sein, ein Denkanstoß würde geügen :D)
Vielen Dank im voraus!! :)

2 Antworten
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.)
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.
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!
Danke für diesen Ansatz, nur noch eine Frage, hättest du eine Idee wie man die y-Koordinate am besten berechnen kann?