第5弾、第6弾では同心円1つ、2つでやりましたが、合計が306になる複数の同心円って他にもあるんですよね。同心円が3個でそれぞれ102個の円とか。組み合わせは、1×306、2×153、3×102、6×51、9×34、17×18とその逆の12通りあるので試してみます(厳密に言えば、306個の円で一重であれば同心円とは言えないのですが)。
ルールは以下。
- キャンバスの大きさを決める(1000×600)
- 短辺の長さの円とする(最後の補足1参照)
- キャンバスの中心をランダムに算出して描く(四隅にこだわると難しい)
- 描く色の色相はXの位置から算出(範囲は0〜1000となり、HSB形式の色相は1000までとる)→機械的にやっているので通常の色相360じゃなくてもよいことにする(最後の補足2参照)
12画像は以下(クリックで拡大します)。上の画像はその中で一番気に入った9個x34重の同心円です。
コードは画像の下にあります。
※この記事は、7月までに三〇六輪100個作る企画の第7弾です。
//
// メイン処理
//
void setup() {
size(1000,600);
colorMode(HSB,1000,100,100,100);
smooth();
noFill();
strokeWeight(1);
// 作成する同心円の個数を配列numMaxに入れ、配列の個数を取得numCount
int[] numMax = new int[] {1,2,3,6,9,17,18,34,51,102,153,306};
int numCount = numMax.length;
// 作成する個数分ループ
for (int itrArray = 0; itrArray<= numCount-1; itrArray++) {
int count = numMax[itrArray]; // 同心円の個数をcountに設定
int itrMax = 306 / count; // 1つの円の中の円の個数
background(0,0,100,100); // 背景は白
// 作成する同心円の個数分ループ
for (int itr=1; itr <= count; itr++) {
draw(count,itrMax); // 円を描く
save("306rin-007-" + str(count) + ".png" ); // 画像をセーブする
}
}
}
//
// 円を描く
//
void draw(int numMax, int itrMax) {
float wd, xpos, ypos,dia;
float valh, vals, valb;
dia = 1200; // 直径は短辺x2にする
xpos = random(0,1000); // X位置をX軸範囲よりランダムに選ぶ
ypos = random(0,600); // Y位置をY軸範囲よりランダムに選ぶ
valh = xpos; // 色相はX位置と同じにする(色相レンジは1000で設定)
vals = 100;
valb = 100;
wd = dia;
// 同心円を描く(大きい円から内側へ)
for (int itr = 1; itr <= itrMax; itr++) {
// 線のアルファチャネルを変化させ、内側に行くほど透明にする
stroke(valh,vals,valb,(100-(itr-1)*100/itrMax));
ellipse(xpos,ypos, wd, wd);
wd = dia * (itrMax-itr)/itrMax; // 直径を現状よりも小さくする
}
}
補足
なお、キャンバスの大きさを決める以外は人が決めないようにしたいので、円の半径、色相について以下の考慮をしましたが、上述のコードの方がよかったので円の半径は短辺のみ、色相はX位置のみ考慮するようにしました。
補足1
円の大きさを短辺か長辺かどちらを使うかを、くじ引き的に1〜10の数字をランダムに選んだ時に偶数だったら長辺、奇数だったら短辺としてみたのですが、円どうしの干渉がぼやけた感じになってしまいました。
補足2
色相をX+Yで1600とした場合と、Xのみ1000とした場合では、1.6倍の開きがあるせいか1600だと色相が偏ってしまうため(特に9、17、18個の同心円のときに感じた)Xのみで1000にしました。
参考までに補足1、2を考慮した結果を以下に貼り付けます。