如何优化使用递归制作的Sierpinski地毯?

时间:2018-05-27 15:21:07

标签: recursion processing fractals

我按照Shiffmans关于递归的教程来结束这个:Sierpinski carpet i made

您可以看到它并不完美,我认为代码可以进行优化。如何摆脱不应该存在的粗线?如果您了解我如何优化此代码,请告诉我!

这是在处理3.3.6时完成的,代码如下:

void setup() {
  size(800, 800);
}

void draw() {
  background(255);
  fill(0);
  noStroke();

  rectMode(CENTER);
  Serpinski(width/2, height/2, width/3);
}

void Serpinski(int x, int y, int d) {
  rect(x, y, d, d);
  if (d > 1) {
    Serpinski(int(x+ d), y, d*1/3);
    Serpinski(int(x- d), y, d*1/3);
    Serpinski(x, int(y+ d), d*1/3);
    Serpinski(x, int(y- d), d*1/3);
    Serpinski(int(x+ d), int(y+ d), d*1/3);
    Serpinski(int(x- d), int(y- d), d*1/3);
    Serpinski(int(x+ d), int(y- d), d*1/3);
    Serpinski(int(x- d), int(y+ d), d*1/3);
  }
}

2 个答案:

答案 0 :(得分:1)

如评论中所述,更改Sierpinski方法以使其处理 float 值而不是 int 将有所帮助。

void setup() {
  size(800, 800);
}

void draw() {
  background(255);
  fill(0);
  noStroke();
  rectMode(CENTER);
  Serpinski(width/2, height/2, width/3);
}

void Serpinski(float x, float y, float d) {
  rect(x, y, d, d);
  if (d > 1) {
    Serpinski( x+ d,  y,    d/3);
    Serpinski( x- d,  y,    d/3);
    Serpinski( x,     y+ d, d/3);
    Serpinski( x,     y- d, d/3);
    Serpinski( x+ d,  y+ d, d/3);
    Serpinski( x- d,  y- d, d/3);
    Serpinski( x+ d,  y- d, d/3);
    Serpinski( x- d,  y+ d, d/3);
  }
}

但是,由于the way the pixel information is handled,您会发现当您使用较小的矩形时,图形表示仍然不是“精确”。实现这一目标的一种方法是将草图的大小更改为3的幂:

size(729, 729);

至于优化,你可以在 setup()中调用Sierpinski方法,这样它只会被计算一次而不是每次调用 draw()。< / p>

答案 1 :(得分:0)

喜欢吗?

void setup() {
  size(729, 729);
  fill(0);
  background(255);
  centerRectangle(0, 0, width);
  rectangles(width/3, height/3, width/3);
}

void centerRectangle(int x, int y, int s) {
  float delta = s/3;
  noStroke();
  rect(x+delta, y+delta, delta, delta);
}

void rectangles(int x, int y, int s) {
  if (s < 1) return;
  int xc = x-s;
  int yc = y-s;
  for (int row = 0; row < 3; row++) {
    for (int col = 0; col < 3; col++) {
      if (!(row == 1 && col == 1)) {
        int xx = xc+row*s;
        int yy = yc+col*s;
        centerRectangle(xx, yy, s);
        rectangles(xx+s/3, yy+s/3, s/3);
      }
    }
  }
}