Hier ist eine Methode, um zu versuchen: eine iterative Suche eine simulierte Abstoßungskraft verwendet wird.
Algorithm
zuerst die Daten durch die Anordnung der Kreise über die Oberfläche in jeder Art von Algorithmus eingestellt initialisieren. Dies ist nur für die Initialisierung, also muss es nicht großartig sein. Der Periodensystemcode wird gut funktionieren. Weisen Sie jedem Kreis eine "Masse" zu, indem Sie seinen Radius als Massenwert verwenden.
Jetzt beginnen Sie die Iteration, um auf eine Lösung zu konvergieren. Führen Sie für jeden Durchgang durch die Hauptschleife Folgendes aus:
Berechnen Sie die Abstoßungskräfte für jeden Kreis. Modellieren Sie Ihre Abstoßungskraft nach der Formel für die Gravitationskraft mit zwei Anpassungen: (a) Objekte sollten weggeschoben werden voneinander, nicht zueinander hingezogen, und (b) müssen Sie die "Kraftkonstante" zwicken Wert entsprechend der Größe Ihres Modells. Abhängig von Ihrer mathematischen Fähigkeit können Sie während der Planung einen guten konstanten Wert berechnen. Sonst experimentieren Sie einfach ein wenig und Sie werden einen guten Wert finden.
Nach der Berechnung der Gesamtkräfte auf jedem Kreis (bitte schauen Sie sich das N-Körper-Problem an, wenn Sie nicht sicher sind, wie dies zu tun ist), bewegen Sie jeden Kreis entlang des Vektors seiner gesamten berechneten Kraft mit der Länge von der Vektor als die Entfernung zu bewegen. An dieser Stelle müssen Sie möglicherweise den Wert für die Kraftkonstante anpassen. Zuerst werden Bewegungen mit einer Länge von weniger als 5% des Radius der Kugel gewünscht.
Die Bewegungen in Schritt 2 haben die Kreise von der Oberfläche der Kugel weggeschoben (weil sie sich gegenseitig abstoßen). Bewegen Sie nun jeden Kreis zurück zur Kugeloberfläche, in Richtung zum Mittelpunkt der Kugel.
Berechnen Sie für jeden Kreis den Abstand von der alten Position des Kreises zu seiner neuen Position. Die größte bewegte Strecke ist die Bewegungslänge für diese Iteration in der Hauptschleife.
Fahren Sie eine Weile mit der Iteration durch die Hauptschleife fort. Im Laufe der Zeit sollte die Bewegungslänge immer kleiner werden, wenn sich die relativen Positionen der Kreise zu einer Anordnung stabilisieren, die Ihren Kriterien entspricht. Verlasse die Schleife, wenn die Bewegungslänge unter einen sehr kleinen Wert fällt.
Tweaking
Sie können feststellen, dass Sie die Kraftberechnung zu optimieren, den Algorithmus zu bekommen auf einer Lösung zu konvergieren. Wie Sie optimieren, hängt von der Art des Ergebnisses ab, nach dem Sie suchen. Beginne damit, die Kraftkonstante zu optimieren. Wenn das nicht funktioniert, müssen Sie möglicherweise die Massenwerte nach oben oder unten ändern. Oder vielleicht ändern Sie den Exponenten des Radius in der Kraftberechnung. Zum Beispiel, statt dies:
f = (k * m[i] * m[j])/(r * r);
Sie könnten versuchen, diese:
f = (k * m[i] * m[j])/pow(r, p);
Dann können Sie mit unterschiedlichen Werten von p experimentieren.
Sie können auch mit verschiedenen Algorithmen für die anfängliche Verteilung experimentieren.
Die Anzahl der Versuche hängt von Ihren Entwurfszielen ab.
Worauf möchten Sie optimieren? IE: Kleinste Kugel für alle Kreise oder die Anzahl der Kreise, die auf eine Kugel mit bestimmter Größe passen oder was? In Bezug auf diese Frage, was meinst du mit "gleichmäßig verteilen"? – Nuclearman
werfen Sie einen Blick auf die Quelle für diese Seite - könnte Ihnen eine Idee oder zwei geben; http://www.engineeringtoolbox.com/kleinere-kreise-in-larger-circle-d_1849.html – mike510a