面向对象的序列分形ArrayList查询

时间:2016-07-18 03:08:45

标签: processing

我正在尝试在处理中对分形进行编码,并使用frameRate或mousePressed功能顺序更新世代/深度。我知道实现这一目标的一种方法是将代数视为对象并使用两个ArrayLists ...一个用于初始状态,另一个用于存储下一代。

附上我的代码正在进行中。任何帮助将非常感谢。我试图通过类的构造函数预先计算曲线和操作,并将它们添加到新的Arraylist(然后它将成为当前的Arraylist)。我希望在不擦除上一代的情况下实现这一目标。

EDIT ///////////////////////////////////////// 在这里,我几乎已经找到了一个解决方案,但是当目前的arrayList成为下一代时,因为当前一代分形被删除,所以它还没有完全解决。

ArrayList<Fractal> circle;

void setup() {
  size(500, 500);

  //start with one circle
  circle = new ArrayList<Fractal>();
  //pass in the initial constructor
  circle.add(new Fractal(width/2, height/2, 200));
}

void draw() {
  background(255);
  //show all circles??? with an enhanced forLoop
  for (Fractal f : circle) {
    f.display();
  }
}

//mousePressed advances the sequence
void mousePressed() {
  generate();
}

void generate() {
  //generate next set of circles
  ArrayList<Fractal> next = new ArrayList<Fractal>();
  for (Fractal f : circle) {
    next.add(new Fractal(f.x + f.r/2, f.y, f.r/2));
    next.add(new Fractal(f.x - f.r/2, f.y, f.r/2));
  }
  circle = next;
}


class Fractal {
  float x, y, r;

  public Fractal (float x, float y, float r  ) {
    this.x = x;
    this.y = y;
    this.r = r;
  }

  void display() {
    stroke(0);
    ellipse(x, y, r, r);
  }
}

1 个答案:

答案 0 :(得分:0)

这里有很多编译错误和逻辑问题。让我们从这里开始:

  ////serious issues here###############################
  float moveA() {
    CircleFractal(x + r/2, y, r/2);
    drawCircle(x - r/2, y, r/2, num);
    drawCircle(x, y + r/2, r/2, num);
    drawCircle(x, y - r/2, r/2, num);
    return moveA.get();
  }

你并不是说这里有严重的问题。 (将来,请尝试更具体:哪些问题?您到底想要做什么?)

但是从你试图使用这个功能的方式来看,我猜你基本上希望它能够为特定的圆圈返回下一代。这意味着您将不得不返回ArrayList。此外,您还不想绘制它们,只需返回它们即可。所以它可能看起来像这样:

ArrayList<CircleFractal> moveA() {
    ArrayList<CircleFractal> myChildren = new ArrayList<CircleFractal>();
    myChildren.add(new CircleFractal(x + r/2, y, r/2));
    myChildren.add(new CircleFractal(x - r/2, y, r/2));
    myChildren.add(new CircleFractal(x, y + r/2, r/2));
    myChildren.add(new CircleFractal(x, y - r/2, r/2));
    return myChildren;
}

然后在generate()函数中,您可以这样调用它:

next.addAll(c.moveA());

但请注意,您跟踪已经绘制的CircleFractals的逻辑并没有多大意义。您只需将最新一代存储在circles变量中,因此如果您想返回并更改第一代的颜色,则无法执行此操作。

相反,您可以创建ArrayList ArrayLists,这样您就可以访问每一代的圈子。或者你可以将所有这些存储在同一个ArrayList中,但是你必须要小心你正在创建孩子的那些。

无论如何,回到你的编译错误:nextLevel()函数似乎没有做任何事情,所以我只是删除它。

为什么restart()类中的CircleFractal函数?重启一个圆圈是否有意义?为什么从restart()构造函数调用CircleFractal函数?每次添加圆圈时,您是否重新开始模拟?那可能不对。所以我将restart()函数移出该类,并停止从restart()构造函数调用CircleFractal函数。您还需要在重新启动动画时将第一代(中间的单个圆圈)添加到ArrayList

你的count课程中也有一个CircleArray变量似乎没有多大意义。您似乎正在尝试跟踪世代号,这意味着您需要在创建新一代时增加该变量。所以我将generationCount作为草图级变量,然后在generate()函数中增加它。

然后你在顶部有一个CircleFractal c;变量,你没有使用它,所以我就摆脱了它。

然后你需要取消注释display()函数,然后调用它。请记住以上问题,您只跟踪最新一代。

从小处开始!

老实说,如果我是你,我会先从一个更简单的草图开始。不要担心分形或动画。显示一个圆圈。然后让第一个圈子的孩子们工作:不要担心任何后代,只需要让5个圈子工作。您可以将它们添加到允许您更改颜色的数据结构中吗?只有在你完美地运作之后,你才能开始考虑第三代。

从较小的步骤开始,以较小的步骤工作,这样你就不会发现自己乱七八糟的代码并没有真正起作用。然后,如果你卡在一个特定的步骤,你可以发布一个MCVE以及一个特定的“我试过X,期望Y,但得到Z而不是”类型的问题,因为它很难帮助一般“我不知道怎么做“打字问题。祝你好运。