【发布时间】:2015-06-22 21:39:41
【问题描述】:
我正在编写一个可视化晶体的程序。作为程序的一部分,我必须在晶格结构中生成所有不同的基本点。对于那些不熟悉晶体学的人,您可以在这里找到这些结构的最一般情况: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)。
为前 50 个整数生成坐标的简单 C++ 程序:
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;
}
我通过为 z 值保留一个附加列来将此算法扩展到 3D,并为其他 Lattice 类型通过保留类型为 x+1/2、y+1/2、z 的前一列或两列+1/2 属性,每种晶格类型都不同。
所以我的问题是:这个算法已经存在了吗?它有名字吗?或者这只是二进制数学的一个明显应用?我读过一些关于哈希图的东西,但这对我来说似乎更有效,至少在处理整数时是这样。
这是我在 stackexchange 上的第一个问题,我怀疑我必须在此处或物理论坛上发布此问题。或者在数学论坛上,因为这是一种 R^2->R 双射。所以如果这个问题不在正确的地方,请纠正我。
【问题讨论】:
标签: algorithm coordinates coordinate-systems coordinate