Ich versuche die parametrische Gleichung der Flugbahn eines Punktes zu finden, der über verschiedene Punkte auf der Oberfläche einer Einheitskugel springt, so dass:
Das habe ich versucht
%Vor%BEARBEITEN - & gt; Kann jemand eine gleichmäßigere Flugbahn finden, die die Kugel möglicherweise schneller (d. h. mit der kleinsten Anzahl von Sprüngen) und gleichmäßiger abdeckt? Regelmäßige Flugbahn in dem Sinne, dass sie die Richtung reibungslos, nicht scharf ändern sollte. Ästhetische Schönheit ist ein Bonus. Die Punkte sollten möglichst gleichmäßig auf der Oberfläche der Kugel verteilt sein.
Ändern Sie den Anfang Ihres Codes, um eine Drehung der zugrunde liegenden Sphäre einzuführen. Dies ergibt eine Flugbahn, die nicht so häufig zu den Polen zurückkehrt. Es kann einige Anpassungen der Rotationsgeschwindigkeiten erfordern, um "nett" auszusehen (und es sieht wahrscheinlich besser aus, wenn es nur um eine Achse rotiert, nicht alle 3). rot_angle1
ist eine Rotation um die x-Achse und rot_angle2
und rot_angle3
sind eine Rotation um die y- und z-Achse. Vielleicht gibt dir das zumindest eine Idee!
Ich habe keine Kopie von Matlab zur Hand, aber ich werde die Änderungen veröffentlichen, die ich an Ihrer Kurve vornehmen würde.
Nur um klar zu sein, da es n-Finity + 1 verschiedene Definitionen für sphärische Winkel gibt. Ich werde das Folgende verwenden, es ist rückwärts von Ihrer Definition, aber ich bin verpflichtet, Fehler zu machen, wenn ich versuche und schalte.
\phi
- der Winkel von der Z-Achse \theta
- der projizierte Winkel in der x-y-Ebene. Sei t
eine diskrete Menge von N gleichmßig verteilten Punkten von 0 bis pi (inklusive).
Eher geradlinig und einfach ist eine Spirale um eine Kugel linear in \phi
und theta
. c
ist eine Konstante, die die Anzahl der vollen Rotationen in \theta
darstellt, sie muss nicht Integer sein.
In Ihrem Beispiel berechnen Sie den Winkel zwischen Vektoren mit atan2(norm(cross....)
, was in Ordnung ist, gibt aber keinen Einblick in das Problem. Dein Problem liegt auf der Oberfläche einer Kugel, nutze diese Tatsache . Also betrachte ich die Entfernung zwischen den Punkten mit dieser Formel
Sie finden nun Nachbarpunkte, die bei t +- dt
und theta +- 2pi
auftreten, egal was passiert.
Im ersten Fall t +- dt
ist es einfach, cos(gamma) = 1 - 2 c^2 sin^2(t) dt^2
zu berechnen. Die sin^2(t)
Abhängigkeit ist der Grund, warum die Pole dichter sind. Idealerweise möchten Sie theta(t)
und phi(t)
so wählen, dass dtheta^2 * sin^2(phi)
konstant und minimal ist, um diesen Fall zu erfüllen.
Der zweite Fall ist ein bisschen schwieriger und bringt meine Kommentare über "Staffelung" Ihrer Punkte. Wenn wir ein N so wählen, dass dtheta
2pi nicht gleichmäßig teilt, dann kann nach einer vollen Drehung um die Kugel in theta
ich nicht direkt unter einem vorherigen Punkt enden.
Um den Abstand zwischen Punkten in diesem Fall zu vergleichen, verwenden Sie delta t
, also c delta t = 1
. Dann haben Sie delta phi = delta t
und delta theta = 2 c delta t - 2pi
. Abhängig von Ihrer Wahl von c
, delta phi
kann oder kann nicht klein genug sein, um die kleinen Winkelnäherungen zu verwenden.
Es sollte offensichtlich sein, dass c=0
eine gerade Linie entlang der Kugel ist. Wenn Sie c
erhöhen, erhöhen Sie die "Dichte der Spirale" und erhalten mehr Abdeckung. Sie erhöhen jedoch auch die Entfernung zwischen benachbarten Punkten. Sie werden ein c
für das gewählte N
wählen müssen, das die obigen zwei Abstandsformeln ungefähr gleich macht.
BEARBEITEN einige Sachen für Sauberkeit in Mathbin verschoben
Ich bearbeite hier, weil es ein langer Code ist. Nach den Hinweisen von David und kalhartt habe ich folgendes versucht:
%Vor%Ich denke, es ist viel besser als vorher! Zwei Dinge, die ich für wichtig halte: 1. theta_sph muss viel schneller sein als phi_sph, um zu vermeiden, zu oft zwei entgegengesetzte Pole zu besuchen; 2. Wenn theta_sph schneller ist als phi_sph, dann musst du langsam über entweder rot_angle1 oder rot_angle2 rotieren, um eine nicht zu chaotische Trajektorie zu erhalten. Ich bin noch offen für irgendwelche anderen Hinweise, um das Ergebnis zu verbessern.
edit: myfigure und myaxes sind Funktionen, die ich habe, um eine Figur und eine Achse zu erstellen
Ich habe eine schnelle Version in C geschrieben, die sich bei einer festen Anzahl von Punkten sehr gut verhält. Sie können damit bei ideone spielen. Wenn Sie einen WebGL-fähigen Browser (Chrome, Firefox) haben, können Sie diese Ergebnisse hier einfügen , um sie anzuzeigen. Die Pole sind wegen einiger integraler Annäherungen, die beim Ableiten der Formeln verwendet werden, ein wenig aus, aber ansonsten ist es schwierig, einen Fehler zu sehen. Es gibt keine Konstanten, die optimiert werden müssen, außer der Anzahl der Punkte, für die Sie eine Ausgabe wünschen.
%Vor%Tags und Links matlab geometry path geometry-surface