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

ステップ 1:pushMatrix()現在のマトリックスの状態を保存するために使用します。

回転を累積させたくないので、これを行う必要があります。ある図形を 30 度回転させ、別の図形を 45 度回転させた場合、2 番目の図形を (30+45) 度回転させたくありません。

のリファレンスはこちらpushMatrix()

ステップ 2: を使用translate()して、必要な場所にシェイプを移動します。

その座標を原点にして形を描いてください!現在、変換後に原点として 0,0 を使用する必要がある場合、原点として x,y を使用して形状を描画しています。

のリファレンスはこちらtranslate()

ステップ 3: を使用rotate()して、原点を中心に形状を回転させます。

関数に渡した x,y に 0,0 を「移動」したことを思い出してくださいtranslate()

ステップ 4: 形を描きます。

ここでも、x,y ではなく、0,0 を原点として使用することを忘れないでください。

のリファレンスはこちら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 に答える