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