Ich schreibe ein Programm zur Visualisierung von Kristallen. Als Teil des Programms muss ich alle verschiedenen grundlegenden Punkte in einer Gitterstruktur erzeugen. Für diejenigen, die nicht mit Kristallographie vertraut sind, finden Sie die allgemeinsten Fälle dieser Strukturen hier: https://en.wikipedia.org/wiki/Hermann%E2%80%93Mauguin_notation#Lattice_typesWas ist das für ein Algorithmus, der Koordinaten an Zahlen anordnet?
Das Problem war, dass ich all diese Punkte verfolgen wollte. Also gab ich ihnen eine Nummer. Ich habe ein bisschen mit Stift und Papier versucht und einen schönen Algorithmus gefunden, um eine Koordinate (entweder in 2D oder in 3D) mit einer Zahl zu verbinden (und umgekehrt), indem ich sie in binärer Form schreibe.
Wenn Sie also zum Beispiel ein einfaches kubisches Gitter in 2D wollen und Sie die Koordinaten von Punkt Nummer 14 kennen, können Sie diese Binärzahl als 001110 schreiben. Sie teilen die Zahl in 00 | 11 | 10, in der der rechte Teil für (x, y) * 1 steht, der mittlere Teil steht für (x, y) * 2, der linke Teil für (x, y) * 4 (was für die Zahl 14 unbrauchbar ist, nur um alles klar zu machen) und so weiter. So nummeriert Nummer 14 auf den Punkt (3, 2).
Eine einfache C++ Programm erzeugen Koordinaten für die ersten 50 ints:
int x, y;
for (int n = 0; n < 50; n++)
{
x = 0;
y = 0;
bitset<16> nset(n);
for (int i = 0; i < 16/2; i++)
{
x+=(nset[2*i]*pow(2.,i));
y+=(nset[2*i+1]*pow(2.,i));
}
cout << n << "\t" << x << "\t" << y << endl;
}
I diesen Algorithmus durch die Reservierung eine zusätzliche Spalte für den Z-Wert ist, und für die anderen Gittertypen auf 3D erweitert die durch die Reservierung erste ein oder zwei Spalten mit einer Art von x + 1/2, y + 1/2, z + 1/2 Eigenschaften, unterschiedlich für jeden Gittertyp.
Also hier ist meine Frage: ist dieser Algorithmus bereits existiert? Hat es einen Namen? Oder ist das nur eine naheliegende Anwendung der binären Mathematik? Ich habe einige Dinge über Hashmaps gelesen, aber das scheint mir effizienter zu sein, zumindest wenn es sich um ganzzahlige Zahlen handelt.
Das ist meine allererste Frage beim Stackexchange, ich zweifelte daran, dass ich das hier oder im Physikforum posten musste. Oder vielleicht im Mathematik-Forum, weil das eine Art von Bijektion ist. Also korrigiere mich bitte, wenn diese Frage nicht am richtigen Ort ist.
ok, es macht Sinn, stattdessen bitweise Operatoren zu verwenden, danke dafür! Das kubische Beispiel (geradzahlige Bits nehmen und verketten) ist in der Tat ziemlich einfach. Ich hatte es auf diese Weise nicht gesehen;) Aber ich denke, es könnte ein Vorteil sein, die letzten 1 oder 2 Bits zu verwenden, um die anderen (komplexeren) Gittertypen zu erzeugen. – andwerb