我正在尝试在处理中对分形进行编码,并使用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);
}
}
答案 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而不是”类型的问题,因为它很难帮助一般“我不知道怎么做“打字问题。祝你好运。