Как я могу оптимизировать этот ковер Серпинского, который я сделал с помощью рекурсии? - PullRequest
0 голосов
/ 27 мая 2018

Я следовал руководству 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);
  }
}

1 Ответ

0 голосов
/ 27 мая 2018

Как упомянуто в комментариях, поможет изменение метода Серпинского, чтобы он работал со значениями 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);
  }
}

Однако из-за способ обработки информации о пикселях , вы обнаружите, что графическое представление все еще не является "точным", когда вы переходите к меньшим прямоугольникам.Один из способов добиться этого - изменить размер эскиза на степень 3:

size(729, 729);

Что касается оптимизации, вы можете вызвать метод Серпинского в setup () таким образом он вычисляется только один раз, а не каждый раз, когда вызывается draw () .

...