您可以看到它并不完美,我认为代码可以进行优化。如何摆脱不应该存在的粗线?如果您了解我如何优化此代码,请告诉我!
这是在处理3.3.6时完成的,代码如下:
void setup() {
size(800, 800);
}
void draw() {
background(255);
fill(0);
noStroke();
rectMode(CENTER);
Serpinski(width/2, height/2, width/3);
}
void Serpinski(int x, int y, int d) {
rect(x, y, d, d);
if (d > 1) {
Serpinski(int(x+ d), y, d*1/3);
Serpinski(int(x- d), y, d*1/3);
Serpinski(x, int(y+ d), d*1/3);
Serpinski(x, int(y- d), d*1/3);
Serpinski(int(x+ d), int(y+ d), d*1/3);
Serpinski(int(x- d), int(y- d), d*1/3);
Serpinski(int(x+ d), int(y- d), d*1/3);
Serpinski(int(x- d), int(y+ d), d*1/3);
}
}
答案 0 :(得分:1)
如评论中所述,更改Sierpinski方法以使其处理 float 值而不是 int 将有所帮助。
void setup() {
size(800, 800);
}
void draw() {
background(255);
fill(0);
noStroke();
rectMode(CENTER);
Serpinski(width/2, height/2, width/3);
}
void Serpinski(float x, float y, float d) {
rect(x, y, d, d);
if (d > 1) {
Serpinski( x+ d, y, d/3);
Serpinski( x- d, y, d/3);
Serpinski( x, y+ d, d/3);
Serpinski( x, y- d, d/3);
Serpinski( x+ d, y+ d, d/3);
Serpinski( x- d, y- d, d/3);
Serpinski( x+ d, y- d, d/3);
Serpinski( x- d, y+ d, d/3);
}
}
但是,由于the way the pixel information is handled,您会发现当您使用较小的矩形时,图形表示仍然不是“精确”。实现这一目标的一种方法是将草图的大小更改为3的幂:
size(729, 729);
至于优化,你可以在 setup()中调用Sierpinski方法,这样它只会被计算一次而不是每次调用 draw()。< / p>
答案 1 :(得分:0)
喜欢吗?
void setup() {
size(729, 729);
fill(0);
background(255);
centerRectangle(0, 0, width);
rectangles(width/3, height/3, width/3);
}
void centerRectangle(int x, int y, int s) {
float delta = s/3;
noStroke();
rect(x+delta, y+delta, delta, delta);
}
void rectangles(int x, int y, int s) {
if (s < 1) return;
int xc = x-s;
int yc = y-s;
for (int row = 0; row < 3; row++) {
for (int col = 0; col < 3; col++) {
if (!(row == 1 && col == 1)) {
int xx = xc+row*s;
int yy = yc+col*s;
centerRectangle(xx, yy, s);
rectangles(xx+s/3, yy+s/3, s/3);
}
}
}
}