Hallo Gemeinde,
ich habe eine Kugel aus LED's, also einen LED-Ball (siehe Anhang).
Zu Ansteuerung des Ball gibt es von mit eine Software mit der die
einzelnen LEDs in Kugelkoordinaten angesteuert werden.
Ich möchte gerne auf der Kugeloberfläche einen Kreis abbilden. Kennt
vielleicht jemand die Formel, mit der man einen Kreis (Kleinkreis) auf
der Kugeloberfläche in Kugelkoordinaten zeichnen kann?
Alternativ würde mir auch die Formel für einen Großkreis für einen
beliegen Azimutwinkel PHI und Polarwinkel THETA reichen.
Prof. Google gibt da nichts her.
Bezugspunkt ist immer der Kugelmittelpunkt.
Gruß
Albundy
Ein wenig Geometrie, ein paar Gleichungen. Was soll Gurgel denn bringen
? Wie man die Gleichung fuer die Kugel mit der Gleichung fuer einen
Ebene verbindet und loest ?
Vllt findeste ja ne Formel wenn du bei Google nach Parametrisierung und
Kurvenintegral suchst.
Dann findeste vllt ne Uniübung mit Lösung zu dem Thema.
Ansonsten selber ausrechnen, ich mach das heute Abend aber nicht mehr.
(Wir hatten das Thema grade würg)
Du kriegst auf jeden Fall Kreise, wenn du alle Punkte mit konstantem Phi
oder konstantem Theta anmalst. Alle möglichen Kreise sind das aber
noch nicht... müsste ich jetzt auch rechnen ;)
Falls nicht die Fahrschule die Krönung deiner Bildungslaufbahn gewesen
ist,
wird dich die Parameterdarstellung eines Punktes auf der Kugeloberfläche
hieraus
http://de.wikipedia.org/wiki/Kugel
kombiniert mit der Parameterdarstellung eines Kreises
daraus
http://de.wikipedia.org/wiki/Kreis
zum Ziel deines Begehrens führen :-)
Einen beliebigen Kreis in einer beliebigen Orientierung auf einer
idealen Kugel abzubilden ist leicht. DIe Verdrehung aus der Ausgangslage
ist eine Matrix und dann hachelt man einfach Punkte vom Kreisumfang in
der Ausgangslage durch die Matrix und kriegt die entsprechenden
Abbildungspunkte auf der Kugel.
Nur überseht ihr die Diskretisierung durch die vorgegebene Geometrie der
LED-Anordnung. Die macht das Problem schwer, wenn die Lösung dann auch
noch effizient sein soll.
Im Grunde ist es das 3D Analogon zum Problem eine Bitmap zu drehen und
zu bestimmen, an welcher Zielposition ein Pixel aus dem Ausgangsbild
auftaucht. Und zwar ohne, dass dabei Löcher entstehen (im Grunde muss
man rückwärts rechnen: welches Quellpixel wird an einem gegebenen
Zielpixel abgebildet und wenn es kein eindeutiges Quellpixel gibt, wird
eines aus den 4 benachbarten Pixel interpoliert). Nur dass das ganze
hier in 3D stattfindet und die Regelmässigkeit des Rasters nicht gegeben
ist.
Ich könnte mir vorstellen, dass ein gangbar schneller Weg darin
besteht, die Sache anders aufzuziehen: Der abzubildende Kreis liegt ja
in einer Ebene. Von dieser Ebene bestimmt man sich die Ebenengleichung
und dann rattert man die ganzen Segmentbögen von oben nach unten durch
und bestimmt ob die jeweilige LED über oder unter der Ebene liegt. Beim
0-Durchgang durch diese Ebene (Vorzeichenwechsel) schaltet man eine der
beiden benachbarten LED ein (je nachdem welche näher an der Ebene
liegt). Diese Distanzrechnung ist schnell zu machen (3 Multiplikationen
und 4 Additionen) wenn man erst mal die Ebenengleichung hat. Zudem kann
man in einer fortgeschrittenen Version des Verfahrens ausnutzen, dass
der Schnittpunkt mit der Ebene beim nächsten Segmentbogen sich nicht
stark vom Schnittpunkt im zuletzt untersuchten Bogen unterscheiden wird.
Das würde zumindest für Großkreise funktionieren. Bei Kleinkreisen kann
ein Segmentbogen natürlich mehrere Schnitte haben. Da wirds dann
komplizierter.
1) Die Kugeloberfläche wird je nach LED-Verteilung in Teilflächen
aufgeteilt. Jede LED ist für die Beleuchtung ihres Teilstückchens
"verantwortlich".
2) Berechne die Parameterdarstellung eines Kleinkreises, etwa
Polare θ = const. In dem Falle ist der Parameter gerade der Azimut ϕ.
3) Transformiere diesen Kreis an die gewünschte Stelle. Der
Ursprungskreis liegt dabei rotationssymmetrisch um den Zenit.
Hier kann sich Möbiusisometrien als hilfreich erweisen:
http://de.wikipedia.org/wiki/Möbiustransformation#Isometrien
4) Berechne, welche Teilstückchen der so transformierte Kreis schneidet.
Die jeweils verantwortliche LED leuchtet.
Hinweis:
Eine Möbiustrafo M transformiert immer Kreise in Kreise, and zwar auch
denn, wenn man ihre Aktion in der komplexen Ebene betrachtet. Dabei
werden Geraden als Kreise mit unendlich großem Radius angesehen, die
durch den Pol (Unendlich) verlaufen.
"Möbius Transformations Revealed is a wonderful video clarifying a deep
topic"
http://www.ima.umn.edu/~arnold/moebius/index.html
In der komplexen Ebene ist das Problem vielleicht besser arithmetisch
zugänglich. So werden die LED-Stücke durch solche Stücke solcher Kreise
begrenzt. Diese wiederum können vermutlich ohne großen Qualitätsverlust
durch Strecken oder Halbgeraden modelliert werden. Kantenstückchen, die
auf einem Meridian liegen, werden ohnehin zu Strecken oder Halbgeraden.
Hallo,
die Frage ist, ob sich die ganze Rechnerei lohnt - die Kreise werden
beschissen aussehen. Dazu kommt noch, dass die abgebildete Kugel um
mindestens den Faktor 4 zuwenige LEDs hat, um überhaupt irgendetwas
abzubilden. Dazu müsste die Kugeloberfläche dicht mit LEDs besetzt sein
(wobei die Anordnung ein Problem für sich darstellt). Aus
Grosskreisscheiben kann man so eine Kugel jedoch nicht zusammensetzen,
eher schon aus 5- und 6-Ecken wie einen traditioneller Fussball (bzw.
Fulleren).
Gruss Reinhard
Ich stimme Reinhard zu. Du kannst die Großkreise in beide Richtungen
anzeigen, und wahrscheinlich noch die Kreise mit Theta konstant, aber
alle anderen werden als Kreis kaum zu erkennen sein. Das Rechnen lohnt
sich wohl kaum.
Idee:
Wenn Du dich auf einer X-Y Ebene befindest, kannst Du eine Gerade
schrittweise zeichnen.
x+=dx;
y+=dy;
Das Verhältnis dy/dx gibt die Richtung.
Wenn Du die LEDs auf der Kugel über die Winkel Phi und Theta
adressierst, könnte folgendes einen Kreis ergeben:
phi+=dphi;
theta+=dtheta;
Probe: setzt man dphi auf 0, ergibt sich ein Kreis auf dem Umfang der
Kugel.
Hallo zusammen,
erst mal vielen vielen Dank an alle.
Die Kugel habe ich aufgebaut, basierend auf dem thread
Beitrag "LED Blinky Ball Monochrom"
Das Bild ist gerendert.
Was aber das geometrische Problem betrifft:
Die Auflösung der Kugel ist nicht sonderlich gut, aber für meine Zwecke
ausreichend. Meine geometrischen Kenntnisse sind etwas eingerostet. Ich
hatte die Hoffnung, dass es eine einfache Formel gibt, die der ATMega
noch in einer annehmbaren Zeit berechnen kann.
Ich werde versuchen, diese mir herzuleiten. Kreise durch Rotation von
Phi und Theta funktioniert aber schon. Eben nur Kreise in beliebiger
Position auf der Kugeloberfläche nicht.
Trotzdem nochmals Danke an euch.
Gruß
Albundy
Hallo
Kugel Radius R,
Kreis um Mittelpunkt M(Mb,Ml) mit Radius r < R*pi/2 = Umfang/4
Für einen beliebigen Mittelpunktswinkel (KMN)=y, (N=NPol , 0 < y < pi)
liegt der Punkt K(b,l) auf der Kreislinie, falls gilt:
b = arcsin(SB)
l1 = Ml + arccos( ( cos(r/R)-sin(Mb)*SB ) / ( cos(Mb)*sqrt(1-SB^2) ) )
l2 = Ml - arccos ...
wobei
SB = cos(r/R)*sin(Mb) + sin(r/R)*cos(Mb)*cos(y)
Probleme:
Anfallende Geo-Winkelbereichsüberschreitungen entsprechend anpassen
Für y=0 wie auch y=pi (K liegt auf Mittelpunkts-Vollmeridian), kann aus
Gründen der Rechengenauigkeit, das arccos-Argument geringfügig aus dem
zulässigen Bereich -1 ... +1 herausfallen und ist in diesem Fall
für < -1 durch -1 und für > 1 durch 1 zu ersetzen.
(Möglicherweise arbeitet die Formel auch für den r-Bereich bis zu r <
Umfang/2 problemlos)
Die Koordinaten sind geographische Koordinaten (Breite,Länge) und sind
nach! Berechnung, geeignet in Kugelkoordinaten umzusetzen.