как сместить квадраты в цикле? - PullRequest
0 голосов
/ 28 октября 2019

Я создаю эскиз иллюзии стены кафе, и мне нужна помощь, чтобы придумать способ компенсировать эффект шахматной доски в обработке. Строка ниже предыдущей не может быть слишком близко к строке над ней. в основном мне нужно, чтобы это тоже выглядело смещенным на половину тайла в каждом ряду, но случайные начальные точки.

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;
    }
}

1 Ответ

0 голосов
/ 29 октября 2019

Вместо того, чтобы выяснить, как перемещать координаты для ваших прямоугольников, "переместите систему координат", используя translate :

final int rectSize = ...

void setup() {
    ...
    noLoop();
    strokeWeight(4);
    stroke(127);
}

На рисовании, а не выяснение x /координаты y для каждого прямоугольника, вместо этого мы «рисуем ряд плиток», начиная с (0,0), а затем мы изменяем значение (0,0) с помощью translate, перемещая его внизодин ряд и вправо или влево немного в зависимости от того, в каком ряду мы находимся;мы хотим двигаться вправо для строк 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) и заканчивающиеся на (width, 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;
  }
}

Результат является должным образом триптическим.

enter image description here

...