【发布时间】:2017-05-12 10:47:56
【问题描述】:
所以我在处理中使用Square 数据类型制作了谢尔宾斯基地毯分形,该数据类型绘制一个正方形并具有一个函数generate(),它从自身生成9 个相等的正方形并返回一个ArrayList (9 -1)=8 去除中间的方块(它不会添加到返回的ArrayList)以生成谢尔宾斯基地毯。
这里是 Square 类 -
class Square {
PVector pos;
float r;
Square(float x, float y, float r) {
pos = new PVector(x, y);
this.r = r;
}
void display() {
noStroke();
fill(120,80,220);
rect(pos.x, pos.y, r, r);
}
ArrayList<Square> generate() {
ArrayList<Square> rects = new ArrayList<Square>();
float newR = r/3;
for (int i=0; i<3; i++) {
for (int j=0; j<3; j++) {
if (!(i==1 && j==1)) {
Square sq = new Square(pos.x+i*newR, pos.y+j*newR, newR);
rects.add(sq);
}
}
}
return rects;
}
}
这是通过鼠标单击向前生成的主要草图 -
ArrayList<Square> current;
void setup() {
size(600, 600);
current = new ArrayList<Square>();
current.add(new Square(0, 0, width));
}
void draw() {
background(255);
for (Square sq : current) {
sq.display();
}
}
void mousePressed() {
ArrayList<Square> next = new ArrayList<Square>();
for(Square sq: current) {
ArrayList<Square> rects = sq.generate();
next.addAll(rects);
}
current = next;
}
问题:
我得到的输出有很细的白线,不应该在那里:
第一代 -
第二代 -
第三代 -
我的猜测是,这些线条只是由于generate() 中的计算偏离一两个像素而出现的白色背景。但是我不确定如何摆脱这些。任何帮助将不胜感激!
【问题讨论】:
-
我注意到您在显示正方形时调用了
noStroke()。我不使用处理,但我在其他需要描边和填充正方形的情况下看到了类似的问题。 -
您说您对正在发生的事情有所猜测。这意味着是时候debug 你的程序来确认你的怀疑了。尝试将其缩小到一个正方形。它的坐标和大小是多少?它们是如何绘制的?如果您在将其缩小到一个正方形后仍然无法弄清楚,那么请发布minimal reproducible example,仅显示该正方形而不是您的整个草图,我们将从那里开始。祝你好运。
-
@KevinWorkman 我证实了我的怀疑,这正是正在发生的事情!现在,画布是 600x600,只能被 3 整除一次,如果我们再次划分,我们会进入小数,并且在第 2 代出现白线。现在,我将大小更改为 900x900,它可以被 3 整除两次,因此这次白线出现在2代之后,即第三代!但是,我无法弄清楚如何准确解决此问题。
-
@KevinWorkman 一个快速解决方法是删除
noStroke()并使笔触与填充颜色相同,它会删除线条但会弄乱后代中的较小方块并使它们看起来不合适这是不希望的。
标签: processing fractals