无法在处理中绘制Sierpinski的三角形

时间:2017-03-22 23:44:25

标签: 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循环有关,但我不确定。

2 个答案:

答案 0 :(得分:0)

就像我在评论中所说,请在发布问题之前尝试debug您的计划。您需要隔离问题并准确理解代码的作用,并且可以使用print语句和Processing编辑器附带的调试器来实现。

但是只看你的代码,我怀疑你有一个草图级level变量以及你传入的level变量这个事实。 drawTri()函数。

在代码执行时考虑该草图级level变量的值。添加打印语句以确切了解它的作用。

如果我摆脱了草图级level变量,我会得到这个,我猜测它更接近你想要的东西:

triangles

答案 1 :(得分:0)

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();

  }

}