日常の進捗

主に自分のための,行為とその習慣化の記録

Mod:Coding Challenge #25: Spherical Geometry

動画は見ていたけど、3Dで球体を計算するというものだったので、既知だったこともあり自分なりに書いてみた。結果見てみると随分書き方は違うけど、配列を使わないで動的に計算している自分のやり方はそれはそれで良いような気もする。2次元で書いた円の半径をz軸方向に終端から中央にかけて大きくして、また小さくする。OpenProcessingだと3D重たいけど内容は分かると思うので載せた。

コード

float r = 500;
float incAngleA = 5;
float incAngleB = 5;

// setup関数 : 初回1度だけ実行される
void setup() {
  size(960, 540, P3D); // ウィンドウサイズを960px,540pxに
  colorMode(HSB, 360, 100, 100); // HSBでの色指定にする
  smooth(); // 描画を滑らかに
}

// draw関数 : setup関数実行後繰り返し実行される
void draw() {
  background(0, 0, 0);
  translate(width/2, height/2, -500);
  rotateX(frameCount*0.01);
  rotateY(frameCount*0.0035);
  for (float angleB = 0; angleB < 180; angleB += incAngleB) {
    float thetaB = radians(angleB);
    beginShape(TRIANGLE_STRIP);
    for (float angleA = 0; angleA <= 360; angleA += incAngleA) {
      fill((angleB+angleA+frameCount)%360, 80, 100);
      noStroke();
      float thetaA = radians(angleA);
      float x = cos(thetaA) * r * sin(thetaB);
      float y = sin(thetaA) * r * sin(thetaB);
      float z = cos(thetaB) * r;
      vertex(x, y, z);
      if (angleB < 180-incAngleB) {
        float px = cos(thetaA) * r * sin(thetaB+radians(incAngleB));        
        float py = sin(thetaA) * r * sin(thetaB+radians(incAngleB));
        float pz = cos(thetaB+radians(incAngleB)) * r;
        vertex(px, py, pz);
      }
    }
    endShape(CLOSE);
  }
}

リファレンス