0
正方形的0
角位于较大正方形的角上。因此,对应于上面的0
的子正方形必须按以下顺序遍历0
或1
,则x
坐标中二进制点后的第一位(假设坐标在[0,1]
范围内)为0
,否则为1
。类似地,如果前两位的值为1
或2
,则y
坐标中的第一位为0
。要确定是否将0
或1
位添加到坐标中,您需要检查该级别的马蹄铁的定向。b
表示二进制常量,并将整数视为位数组,但将其更改为有效的C不应该太难。pos
表示方向的3位整数。前两位是0
在正方形中的x和y坐标,第三位指示1
是否具有与0
相同的x坐标。 pos
的初始值为011b
,这意味着0
的坐标为(0,1),而1
具有与0
相同的x坐标。ad
是地址,视为2位整数的n元素数组,从最高有效位开始。double x = 0.0, y = 0.0;
double xinc, yinc;
pos = 011b;
for (int i = 0; i < n; i++) {
switch (ad[i]) {
case 0: xinc = pos[0]; yinc = pos[1]; pos[2] = ~pos[2]; break;
case 1: xinc = pos[0] ^ ~pos[2]; yinc = pos[1] ^ pos[2]; break;
case 2: xinc = ~pos[0]; yinc = ~pos[1]; break;
case 3: xinc = pos[0] ^ pos[2]; yinc = pos[1] ^ ~pos[2];
pos = ~pos; break;
}
x += xinc / (1 << (i+1)); y += yinc / (1 << (i+1));
}
我用几个8位前缀进行了测试,并根据xkcd地图正确放置了它们,因此我相当有信心代码是正确的。
我期望基于希尔伯特曲线的维基百科代码,你可以跟踪你当前的位置(作为一个(x,y)坐标),并在访问n个单元格后返回该位置。然后,在完成时,缩放到[0..1]上的位置将取决于希尔伯特曲线的高度和宽度。
from turtle import left, right, forward
size = 10
def hilbert(level, angle):
if level:
right(angle)
hilbert(level - 1, -angle)
forward(size)
left(angle)
hilbert(level - 1, angle)
forward(size)
hilbert(level - 1, angle)
left(angle)
forward(size)
hilbert(level - 1, -angle)
right(angle)
诚然,这将是一种暴力解决方案而不是一个封闭形式的解决方案。
bfmap
或bfrev
。 - mgold