Я пишу программу для визуализации кристаллов. В рамках программы я должен генерировать все различные базовые точки в структуре решетки. Для тех, кто не знаком с кристаллографией, вы можете найти наиболее общие случаи этих структур здесь: https://en.wikipedia.org/wiki/Hermann%E2%80%93Mauguin_notation#Lattice_typesЧто это за алгоритм, сопоставляющий координаты с номерами?
Проблема в том, что я хотел отслеживать все эти моменты. Поэтому я дал им номер. Я пытался немного с ручкой и бумагой, и нашел хороший алгоритм для подключения координаты (либо в 2D, либо в 3D) с номером (и наоборот), записав его в двоичной форме.
Итак, если вы хотите, например, простую кубическую решетку в 2D, и вы хотите знать координаты точки номер 14. вы можете записать этот двоичный код как 001110. Вы делите число на 00 | 11 | 10, в которой самая правая часть означает (x, y) * 1, часть средней части обозначает (x, y) * 2, левая часть означает (x, y) * 4 (что бесполезно для числа 14, просто чтобы все было ясно) и так далее. Поэтому число 14 соответствует точке (3, 2).
Простой C++, программа для генерации координат для первых 50 целых чисел:
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;
}
Я продлил этот алгоритм для 3D пути резервирования дополнительного столбца для Z-значения, а также для других типов решетки путем резервирования сначала один или два столбца с видом x + 1/2, y + 1/2, z + 1/2 свойствами, различны для каждого типа решетки.
Итак, вот мой вопрос: этот алгоритм уже существует? У него есть имя? Или это просто очевидное применение бинарной математики? Я читал некоторые вещи о хэшмапах, но это кажется более эффективным для меня, по крайней мере, если вы имеете дело с целыми числами.
Это мой первый вопрос в stackexchange, сомневался, что я должен был опубликовать это здесь или на форуме физики. Или, может быть, на математическом форуме, потому что это своего рода биекция R^2-> R. Поэтому, пожалуйста, исправьте меня, если этот вопрос не в нужном месте.
ОК, имеет смысл использовать побитовые операторы вместо этого, спасибо за это! Кубический пример (взять четные биты и конкатенацию) действительно довольно прост. Я не видел этого таким образом;) Но я думаю, что было бы полезно использовать последние 1 или 2 бита для генерации других (более сложных) типов решетки. – andwerb