1

所以如果你运行这个草图,你会看到一个加号网格。我想轮换每个人,但我似乎无法弄清楚。我试过翻译,pushMatrix/popMatrix。但也许它不在正确的地方。我现在删除了它,也许有人可以指出如何围绕自己的轴旋转每个加号。

int rib;
void setup() {
  size(1200, 800);
  rib = 7;
}


void draw() {
  background(0);
  for (int i = -100; i < width+100; i = i + rib * 10) {
    for (int j = -100; j < height+100; j = j + rib * 10) {
      noStroke();
      fill(255);

      plus(i, j);
      plus(3*rib+i, 1*rib+j);
      plus(6*rib+i, 2*rib+j);
      plus(9*rib+i, 3*rib+j);
      plus(2*rib+i, 4*rib+j);
      plus(5*rib+i, 5*rib+j);
      plus(8*rib+i, 6*rib+j);
      plus(1*rib+i, 7*rib+j);
      plus(4*rib+i, 8*rib+j);
      plus(7*rib+i, 9*rib+j);
    }
  }
}

void plus(int x, int y) {
  pushMatrix();
  beginShape();
  vertex(x+0, y+0);
  vertex(x+0, y+-rib);
  vertex(x+rib, y+-rib);
  vertex(x+rib, y+0);
  vertex(x+2*rib, y+0);
  vertex(x+2*rib, y+rib);
  vertex(x+rib, y+rib);
  vertex(x+rib, y+2*rib);
  vertex(x+0, y+2*rib);
  vertex(x+0, y+rib);
  vertex(x+-rib, y+rib);
  vertex(x+-rib, y+0);
  endShape(CLOSE);
  popMatrix();
}
4

2 回答 2

2

第一步:使用pushMatrix()保存当前矩阵的状态。

您需要这样做,因为您不希望旋转累积。如果您将一个形状旋转 30 度,另一个旋转 45 度,则您不希望第二个形状旋转 (30+45) 度。

是 的参考资料pushMatrix()

第 2 步:translate()用于将形状移动到需要的位置。

确保然后以该坐标为原点绘制形状!现在,当您需要在平移后使用 0,0 作为原点时,您正在绘制以 x,y 作为原点的形状。

是 的参考资料translate()

第 3 步:用于rotate()围绕原点旋转形状。

请记住,您现在已经将 0,0 “移动”到了您传递给translate()函数的 x,y !

第4步:画出你的形状。

同样,请记住使用 0,0 作为原点,而不是 x,y。

是 的参考资料rotate()

第 5 步:调用popMatrix()以恢复调用 `pushMatrix()' 时的矩阵。

这会将旋转和平移恢复正常,因此下一次平移和旋转不会累积。

是 的参考资料popMatrix()

第6步:重复。

将上述所有内容放入一个函数中,然后从 for 循环中调用它以绘制多个形状。

这是一个绘制矩形的简化示例:

void setup() {
  size(500, 500);
}

void draw() {
  background(0);

  noStroke();
  fill(255);

  plus(100, 100);
  plus(200, 200);
}

void plus(float x, float y) {
  pushMatrix();
  translate(x, y);
  rotate(mouseX);
  rect(-20, -40, 40, 80);
  popMatrix();
}
于 2015-10-01T12:37:40.517 回答
1

旋转轴始终位于原点 (0,0)。所以我们必须将原点平移到我们希望旋转轴所在的位置。在您的情况下,以 (0,0) 为中心绘制加号,然后使用 translate 将其移动到所需位置。我用一个更简单的正方形做了这个例子,但想法是一样的。(我没时间了:)看看这是否可以帮助你。

void setup() {
  size(1200, 800);
  noStroke();
  fill(255);
}


void draw() {
  background(0);
  float a  = map(mouseY, 0, height, 30, 270);
  for (int i = -100; i < width+100; i+=40) {
    for (int j = -100; j < height+100; j+=40) {

      plus(i, j, a);
    }
  }
}

void plus(int x, int y, float a) {

  pushMatrix();
  translate(x, y);
  rotate(radians(a));
  beginShape();
  vertex(-10, -10);
  vertex(10, -10);
  vertex(10, 10);
  vertex(-10, 10);
  endShape(CLOSE);
  popMatrix();
}

您可能会喜欢这些教程:

http://processing.org/tutorials/transform2d/

https://processing.org/tutorials/pshape/

于 2015-10-01T12:36:23.247 回答