在处理中绘制 Sierpinski 三角形时遇到问题

Having trouble drawing Sierpinski's Triangle in Processing

我试图在处理 3 中绘制 Sierpinski 的三角形,并设法将其绘制到 运行 前两层。但是,当它尝试绘制第三层和任何后面的层时,它只会在某些三角形中绘制更多三角形。

这是代码

ArrayList<PVector> initPoints;
int level;
void setup() {
  size(400, 400);
  noFill();
  initPoints = new ArrayList<PVector>();
  initPoints.add(new PVector(width/2, height/4));
  initPoints.add(new PVector(width/4, 3 * height/4));
  initPoints.add(new PVector(3 * width/4, 3 * height/4));
}

void draw() {
  triangle(initPoints.get(0).x, initPoints.get(0).y, initPoints.get(1).x, initPoints.get(1).y, initPoints.get(2).x, initPoints.get(2).y);
  for (int i = 0; i < 3; i++) {
    level = 1;
    drawTri(i, initPoints, level);
  }
}

PVector findMid(PVector a, PVector b) {
  int midX = floor((a.x + b.x)/2);
  int midY = floor((a.y + b.y)/2);

  return new PVector(midX, midY);
}

void drawTri(int vertex, ArrayList<PVector> basePoints, int layer) {
  level = layer + 1;
  ArrayList<PVector> points = new ArrayList<PVector>();
  points.add(basePoints.get(vertex % 3));
  points.add(findMid(basePoints.get(vertex % 3), basePoints.get((vertex + 1) % 3)));
  points.add(findMid(basePoints.get(vertex % 3), basePoints.get((vertex + 2) % 3)));
  triangle(points.get(0).x, points.get(0).y, points.get(1).x, points.get(1).y, points.get(2).x, points.get(2).y);
  if (level < 4) {
    for (int i = 0; i < 3; i++) {
      drawTri(i, points, level);
    }
  }
}

有什么建议吗?我认为这与我 运行 使用 for 循环的方式有关,但我不确定。

就像我在评论中所说的那样,请在 post 提问之前尝试 debug 您的程序。您需要隔离问题并准确理解代码的作用,您可以使用打印语句和 Processing 编辑器附带的调试器来做到这一点。

但是只要看看你的代码,我怀疑你有一个草图级别的 level 变量以及一个 level 变量,你传递给 drawTri()函数。

在代码执行时考虑草图级 level 变量的值。添加打印语句以准确查看它在做什么。

如果我去掉 sketch-level level 变量,我会得到这个,我猜它更接近你想要的:

float x = int(random(0,1024));

float y = int(random(0,600));

float ax=512;

float ay=0;

float bx=0;

float by=600;

float cx=1024;

float cy=600;

void setup() 
{

  size(1024, 600);

  background(0);

}
void nextPoint()

{

  int r = int(random(1,7));

  float X;

  float Y;

  if(r==1||r==2)

  {

   X = lerp(x, ax, 0.5) ;

   Y= lerp(y, ay, 0.5);

  }

  else if(r==3||r==4)

  {

   X = lerp(x, bx, 0.5) ;

   Y= lerp(y, by, 0.5);

  }

  else

  {

   X = lerp(x, cx, 0.5) ;

   Y= lerp(y, cy, 0.5);

  }

  x=X;

  y=Y;

}

void drawPoint()
{

  colorMode(HSB,255,255,255);

  stroke(map(y, 0, 15000,100,4000),200,255,10);

  strokeWeight(1);

  point(ax,ay);

  point(bx,by);

  point(cx,cy);

  point(x, y);

}

void draw()
{

  for(int i=0;i<100;++i)
  {

  drawPoint();

  nextPoint();

  }

}