不完整的 Sierpinski 三角形显示

Incomplete Sierpinski's Triangle Displaying

我正在按照教科书 The Nature of code 的示例 7.1 进行操作。 (原代码写在Java,但由于处理库在功能上与p5.js完全相同,所以为了方便,我重写了Java脚本)

我相信我已经逐字复制了示例代码,但不知何故我得到了一个我没想到的结果。显示的 Sierpinski 三角形中有一个不完整的部分。

我想知道我的代码哪里出错了,或者我可能误解了什么导致了这种问题。

这是图片的代码

class CA {
  constructor(ca_width) {
    this.generation = 0;
    this.w = 5;
    this.cells = new Array(1050 / this.w);
    this.newcells = new Array(this.cells.length);
    this.ruleset = [0, 1, 0, 1, 1, 0, 1, 0]; // [1,1,0,1,1,1,1,0]//

    for (let i = 0; i < this.cells.length; i++) {
      this.cells[i] = 0;
    }

    this.cells[this.cells.length / 2] = 1;
  }


  generate() {
    let nextgen = new Array(this.cells.length);
    for (let i = 1; i < this.cells.length - 1; i++) {
      let left = this.cells[i - 1];
      let me = this.cells[i];
      let right = this.cells[i + 1];
      nextgen[i] = this.rules(left, me, right);
    }
    this.cells = nextgen;
    this.generation++;
  }

  rules(a, b, c) {
    let s = "" + a + b + c;
    let index = parseInt(s, 2);
    return this.ruleset[index];
  }

  display() {
    for (let i = 0; i < this.cells.length; i++) {
      if (this.cells[i] == 0)
        fill(255);
      else fill(0);
      stroke(0);
      rect(i * this.w, this.generation * this.w,
        this.w, this.w);
    }
  }
}

let cA;

function setup() {
  createCanvas(windowWidth, windowHeight);
  cA = new CA(1000);
}

function draw() {
  // createCanvas(windowWidth, 400);
  // background(150);

  cA.display();
  cA.generate();
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.1/p5.js"></script>

根据你计算下一代的逻辑,this.cells[0]this.cells.at(-1)始终未定义,呈现为黑色。您可能希望将它们初始化为 0,并可能使用环绕逻辑来计算它们的值(即 cells[0] = rule(cells.at(-1), cells[0], cells[1]))。

我不知道你的 Java 代码是什么样的,但如果你使用的是 new int[] 类型,那么它会被清零并且可能会按预期工作,这与 JS 不同Array().

一般来说,JS中的Array()构造函数要谨慎使用。它使单元格处于未初始化状态(“空槽”),因此您通常希望链接 .fill(0) 或传播/map 使其成为一个可用的、意料之中的数组,您会期望这样的要发出的构造函数,就像在 Java.

中所做的那样

请记住,代码的本质是 available in a p5.js version, and there exist automatic translators from Processing to p5.js, like pde2js。请注意,我没有尝试过 pde2js 或其他翻译器,但它们似乎值得一看。