我正在创建咖啡馆墙壁错觉的草图,需要帮助想出一种方法来抵消处理过程中的棋盘效应。前一行下面的行不能离它上面的行太近。基本上我也需要它看起来偏移了半个瓦片,每行下降,但随机起点。
void setup(){
size (500, 500);
strokeWeight(3);
stroke(127);
tileSize = height/ROW_NUM;
drawTiles();
}
void draw() {
}
void drawTiles() {
for (int i=0; i<ROW_NUM; i++) {
squareX = int(random(-tileSize, 0));
int counter = 0;
while (squareX < width) {
if (counter%2==0) {
fill(0);
rect(squareX, squareY, tileSize, tileSize);
} else {
fill(255);
rect(squareX, squareY, tileSize, tileSize);
}
squareX += tileSize;
counter ++;
}
squareY += tileSize;
}
}
发布于 2019-10-30 00:17:57
通过使用translate来“移动坐标系”,而不是计算如何移动矩形的坐标
final int rectSize = ...
void setup() {
...
noLoop();
strokeWeight(4);
stroke(127);
}
在draw中,我们不是计算每个矩形的x/y坐标,而是从(0,0)开始“绘制一行瓷砖”,然后我们使用translate
改变(0,0)的含义,将它向下移动一行,根据我们所在的行向右或向左移动一点;我们想要向右移动到第1行和第2行,然后向左移动到第3行和第4行,然后向右移动到第5行和第6行,依此类推。因此,如果(行号/2)舍入到偶数,则向左移动;如果舍入到奇数,则向右移动。
void draw() {
int steps = 4;
for(int row=0; row < 1 + height/rectSize; row++) {
drawTileRow();
int step = rectSize / steps;
if ((row / 2) % 2 == 0) {
step = -step;
}
translate(step, rectSize);
}
}
然后,您可以在drawTileRow函数中编写简单得多的代码,只需绘制从(0,0)开始到(宽度,0)结束的矩形,尽管您确实希望从-rectSize
开始,并在width+rectSize
结束,以补偿整个全球坐标系偏移的事实:
void drawTileRow() {
boolean negative = false;
for(int x=-rectSize; x<width+rectSize; x+=rectSize) {
fill(negative ? 255 : 0);
rect(x,0,rectSize,rectSize);
negative = !negative;
}
}
结果是恰如其分的错综复杂。
https://stackoverflow.com/questions/58596823
复制相似问题