Sto scrivendo un programma per visualizzare i cristalli. Come parte del programma, devo generare tutti i diversi punti di base in una struttura reticolare. Per coloro che non hanno familiarità con la cristallografia, qui puoi trovare i casi più generali di queste strutture: https://en.wikipedia.org/wiki/Hermann%E2%80%93Mauguin_notation#Lattice_typesQuali sono le coordinate di questo algoritmo per la mappatura dei numeri?
Il problema era che volevo tenere traccia di tutti questi punti. Quindi ho dato loro un numero. Stavo provando un po 'con carta e penna e ho trovato un buon algoritmo per connettere una coordinata (in 2D o in 3D) con un numero (e viceversa) scrivendolo in forma binaria.
Quindi, se si desidera, ad esempio, un semplice reticolo cubico in 2D e si desidera conoscere le coordinate del punto numero 14. è possibile scrivere questo binario come 001110. Si divide il numero in 00 | 11 | 10, in cui la parte più a destra sta per (x, y) * 1, la parte della parte centrale sta per (x, y) * 2, la parte sinistra sta per (x, y) * 4 (che è inutile per il numero 14, solo per rendere tutto chiaro) e così via. Quindi il numero 14 mappa al punto (3, 2).
Un semplice programma C++ per generare le coordinate per i primi 50 interi:
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;
}
ho esteso questo algoritmo a 3D riservando una colonna supplementare per il valore z, e per gli altri tipi Lattice riservando il prima una o due colonne con tipo di proprietà x + 1/2, y + 1/2, z + 1/2, diverse per ogni tipo di Lattice.
Quindi, ecco la mia domanda: questo algoritmo esiste già? Ha un nome? O è solo una ovvia applicazione della matematica binaria? Ho letto alcune cose su hashmaps, ma questo mi sembra più efficiente, almeno se hai a che fare con numeri interi.
Questa è la mia prima domanda a stackexchange, dubitavo che avrei dovuto postare questo qui o al forum di fisica. O forse al forum di matematica, perché questa è una specie di biiezione R^2> R. Quindi per favore correggimi se questa domanda non è nel posto giusto.
ok, ha senso usare invece operatori bit a bit, grazie per quello! L'esempio cubico (prendi bit pari e concatenati) è in effetti piuttosto semplice. Non l'avevo visto in quel modo;) Ma penso che potrebbe essere un vantaggio usare gli ultimi 1 o 2 bit per generare gli altri tipi di reticolo (più complessi). – andwerb