元序自动机的Z阶曲线和逆Z阶

时间:2015-02-06 20:31:37

标签: dimension z-order cellular-automata

我在Processing中编写了一个程序,它可以模拟任意维度的细胞自动机(总体,最近邻,摩尔邻域)。为了简化操作并使程序尽可能通用,我将单元的状态存储在一维整数数组中。为了计算单元的n维邻居,我将1维数组视为栅格顺序(将第一个坐标从零迭代到所讨论空间的大小,然后将下一个坐标递增1并迭代第一个坐标再一次,等等。)

由于很少有优雅的方法在计算机屏幕的2维中显示n维数据(特别是在这种情况下,理论上n在理论上可以从2到无穷大,实际上至少可以从2到2) 5),我决定尝试使用Z顺序,但我在这个主题上阅读的所有内容都让我感到困惑,所有材料似乎都是从笛卡尔坐标(x1,x2,x3)的假设开始的。 ...... xn),在我的案例中并不适用。

我想要的是能够将1维单元阵列中的元素存储在另一个1维数组中,按n维Z顺序排序,然后转换 >数组到按二维Z顺序排序的数组,以便我可以显示它。我想以有效的方式做到这一点(我试图保持程序以每秒至少0.5帧的速度运行,这在5个维度上已经很难,即使对于小空间也是如此)。

我知道比特交织算法,但我不太确定如何在处理中实现它而不会溢出我的32位整数。任何帮助,将不胜感激。如果您需要更多详细信息,我已经在下面提供了相关代码(是的,我知道它很混乱;这就是我的工作方式):



void setup() {
  colorMode(HSB,255);
  background(0);
  frameRate(10);
  noStroke();
  ruledensity = random(1.1);
  celldensity = 0.1;
  dimension = 2;
  numstates = 5;
  scale = 20;
  rule = new int[int(pow(3.0,float(dimension)))*numstates];
  cells = new int[int(pow(float(scale),float(dimension)))];
  ncells = new int[int(pow(float(scale),float(dimension)))];
  zorder = new int[int(pow(float(scale),float(dimension)))];
  
  size(scale * 4,scale * 4);
  
  for (int a = 0; a < rule.length; a++) {
    if (random(1.0) < ruledensity) {
      rule[a] = 1 + floor(random(numstates - 1));
    } else {
      rule[a] = 0;
    }
  }
  
  for (int b = 0; b < cells.length; b++) {
    if (random(1.0) < celldensity) {
      cells[b] = 1 + floor(random(numstates - 1));
    } else {
      cells[b] = 0;
    }
    ncells[b] = cells[b];
  }
  
  
}

void draw() {
  background(0);
  for (int x = 0; x < cells.length; x++) {
    nsum = 0;
    for (int ex = 0; ex <= dimension; ex++) {
      for(int i = -1; i <= 1; i++) {
        nsum += cells[cyclize(x + i * int(pow(float(scale),float(ex-1))),cells.length)];
      }
    }
    ncells[x] = rule[nsum];
  }
 
&#13;
&#13;
&#13;

0 个答案:

没有答案
相关问题