スクリーンショット_2019-10-17_20

グラデーションによる球体の表現

亀の歩み#13
亀の歩みと称して、ジェネラティブアートの練習を投稿しているのですが、今回は「円の中央や縁ではない点を発端としたグラデーションを表現したい」というモチベーションの下、作成しました。

大概、円のグラデーションと検索して出てくるのは、
1. 中央から広がるタイプ
2. 円周の縁から広がるタイプ

の2種類です。

しかし、やっぱりグラデーションを自由自在に操りたい!

そこで、今回は2ステップに分けてこれを実現しました。
まず、グラデーションの発端となる点を円の中央にした、タイプ1のグラデーション円を先に描画します
次に、その上から、「本当に描画したい円」以外を塗りつぶすように上から描画します

これで、無理やりグラデーションの発端と円の中心がズレた円が完成しました!

スクリーンショット 2019-10-17 20.41.31

3Dみたいな月になりましたね!
めでたしめでたし。

ソースコード

int circleRad = 500;
float circleStrokeWeight = 1.0;
float circleStrokeCount = circleRad/circleStrokeWeight;
int frameRad = 300;
float gridStep = 1.0;
color startColor = color(255, 255, 255);
color endColor = color(239, 234, 95);
void setup() {
 size(800, 800);
 ellipseMode(RADIUS);
 noLoop();
}
void draw() {
 float gridYcount = height/gridStep;
 float gridXcount = width/gridStep;
 
 strokeWeight(circleStrokeWeight+1);
 noFill();
 
 for (int i=0; i<circleStrokeCount; i++) {
   float rad = i*circleStrokeWeight;
   color circleStrokeColor = lerpColor(startColor, endColor, i/circleStrokeCount);
   stroke(circleStrokeColor);
   
   pushMatrix();
   translate(width*5/8, height*5/16);
   ellipse(0, 0, rad, rad);
   popMatrix();
 }
 
 noStroke();
 fill(50);
 
 for (int gridY=0; gridY<gridYcount; gridY++) {
   for (int gridX=0; gridX<gridXcount; gridX++) {
     // farther than circleRad then draw
     float disDiff = (sq(gridX*gridStep-width/2) + sq(gridY*gridStep-height/2)) - sq(frameRad);
     if (disDiff>0) {
       rect(gridX*gridStep, gridY*gridStep, gridStep, gridStep);
     }
   }
 }
 
}

この記事が気に入ったらサポートをしてみませんか?