Ellipsen überfordern mich - bitte um Hilfe
bearbeitet von
Hallo Felix,
> Dazu müsste ich meine Sprites aber alle sehr genau kennen. Meine Lösung möchte ich aber generisch gestalten, damit sie bei egal welchen Sprites grundsätzlich funktioniert.
Hm, ja. Dazu kann man vielleicht was programmieren, was aus einem Image als Vorab-Verarbeitung eine Approximation durch Rechtecke berechnet. Aber es ist natürlich nie perfekt; und wenn dein Spiel so geartet ist, dass diese Vorbereitungsarbeit ineffektiv ist... Das weißt Du sicher am besten. Die Formulierung „egal welche“ ist allerdings sehr weit; die Freiheitsstatue mit einer Ellipse anzunähern wäre z.B. suboptimal.
> Deine Aufteilung in A- und B-Problem sehe ich als den Versuch an, das B-Problem, dessen Implementierung möglicherweise rechenintensiver und schwieriger zu bauen ist, durch ein anderes, simpleres Problem zu ersetzen, welches für die eingesparte Rechenleistung mehr Datenaufwand in der Erstellung erfordert.
Ich persönlich neige zu Formulierungen in diesem Duktus, wenn ich innerlich koche bzw. mich persönlich angegriffen fühle. Das bin aber ich, nicht Du. Sicherheitsrückfrage: Habe ich Dich geärgert? Bist Du sauer? Das wäre vermutlich durch Formulierungen wie „hereinfallen“ und „bespaßt“ verursacht und ich möchte mich dann gerne entschuldigen. Ein schwieriges Problem zu umgehen und dafür eine einfachere Lösung zu wählen, mit der die Aufgabe erledigt wird, finde ich übrigens überhaupt nicht verwerflich; deine Formulierung klingt aber beinah so.
Eine Alternative zu Ellipsen könnten übrigens auch Sechs- oder Achtecke sein. Was hältst Du davon?
Und ich hatte auch noch was in Geogebra zu Ellipsen gebastelt: <https://www.geogebra.org/m/Zh6YTexv>
Ich bin dabei von meinem Vorschlag ausgegangen, vor dem Schnitt zweier Ellipsen eine von den beiden in den Einheitskreis zu transformieren (also Verschieben des Mittelpunktes einer Ellipse nach (0,0) und dann mit (1/a, 1/b) skalieren, wobei a und b die Halbachsen sind.
Im Geogebra kannst Du die beiden Ellipsen mal verschieben. Du siehst, dass ein möglicher Berührpunkt IMMER zwischen den beiden Strecken liegt, die den Mittelpunkt des Kreises mit den Brennpunkten der Ellipsen liegen. Ein Kollisionstest könnte dann so aussehen:
- teste auf Überlagerung der Hüll-Rechtecke. Wenn nein -> keine Überlappung
- transformiere die Ellipse, deren Mittelpunkt das kleinere Y hat, in den Einheitskreis (erst Verschieben, dann Skalieren)
- Führe die gleiche Verschiebung und Skalierung mit der anderen Ellipse durch. Wir haben jetzt einen Einheitskreis K und eine Ellipse E.
- Sei a die lange Halbachse, b die kurze Halbachse. Bestimme für E die lineare Exzentrizität $$e=\sqrt{a^2-b^2}$$ und daraus die Koordinaten der Brennpunkte. Sei m der Mindestabstand der Ellipsenbrennpunkte zum Rand, es ist m=a-e.
- Entartet E zum Kreis (oder beinah zum Kreis, d.h. e/a < 0,01 oder so), prüfe lediglich ob der Abstand der Mittelpunkte kleiner ist als 1+a. Wenn ja -> Überlappung.
- teste, ob einer der Brennpunkte der Ellipse dem Kreis zu nahe kommt. Dabei nutze m; ist ein Brennpunkt dem Mittelpunkt näher als 1+m -> Überlappung
- Bestimme die Schnittpunkte der Verbindungslinien Mittelpunkt-Brennpunkt mit dem Kreis. Das ist mit der Transformation simpel: Ist F ein Brennpunkt, muss nur der Vektor OF auf Länge 1 normiert werden. Dazu teilt man seine Koordinaten durch seine Länge.
- Prüfe, ob einer der beiden Schnittpunkte in der Ellipse liegt. Dazu bestimmt man die Abstände der Schnittpunkte von den Brennpunkten (Vektorlänge) und addiert sie. Ist die Summe größer als 2a, ist der Punkt außerhalb der Ellipse.
- Ist einer von beiden innerhalb -> Überlappung.
- Jetzt bleibt der blöde Rest übrig. Dazu habe ich eine Lösung, von der ich nicht sagen kann, warum sie funktioniert. Aber…
- Schau in mein Geogebra-Blatt. Da habe ich die Verbindungen CG und DF, sozusagen die "Überkreuz-Verbindungen" der Brennpunkte mit den oben genannten Schnittpunkten. Diese Überkreuzverbindungen schneiden sich - diesen Punkt P musst Du berechnen. Das ist lineare Algebra, ein Gleichungssystem mit 2 Variablen. Dafür darf E allerdings nicht zum Kreis entarten, aber den Fall haben wir ja schon weg. Wenn sich K und E berühren, liegt der Berührpunkt auf der Geraden OP. Merkwürdig, aber wahr. Wenn Du also den Vektor OP auf Länge 1 normierst und P dann innerhalb der Ellipse liegt, hast Du eine Überscheidung. Das ist im Prinzip die Idee von Dickie, aber der lag mit den Mittelpunkten falsch.
_Rolf_
--
sumpsi - posui - clusi