Classiclll's Blog

an old boy

Pair Mirrors in a Midnight - 真夜中の合わせ鏡(入れ子構造と条件判断)

イメージ 1

(上の画像、左側に見えているのが本家トップページ

// 前と同じで、やるべきことは二つの関数、setupとdrawを用意すること
// あとはKAMEコマンドを呼ぶだけ

void setup(){   //いっとう最初に一回だけP5から呼び出される
  size(400,300);    //窓のサイズは400×300
}
void draw() {   //普通は一秒間に30回呼び出される
 kami(0);          //新しい黒い紙
 iro(255);          //白いペン
 saisho(100, 50);      //最初は左上隅から右に100、下に50行った点から(下向き)
 awase_kagami(200);    //一辺の長さが200の合わせ鏡を描く
}
void awase_kagami(float len) {  //一辺の長さがlenの合わせ鏡を描くには
 akarusa((len-10)/200.*255);  //長さlenに応じた明るさのペンで
 mae(len);hidari(90); //
 mae(len);hidari(90); //
 mae(len);hidari(90); //
 mae(len);hidari(90); //一辺の長さがlenの正方形を描く
 if (len>10) {     //もし、辺の長さlenが10より大きければ(まだ描けるので)
 hidari(45);             //正方形の中心方向に向いて
 janpu(len*(mouseX+mouseY)/700./10.); //辺の長さlenの【ある】割合だけジャンプして
 migi(45-(mouseX-mouseY)/200.); //さっきの向き(下向き)に(マウス位置で若干ぶれて)戻って
 awase_kagami(len*0.92);       //一辺の長さがlenの92%の合わせ鏡を描く
 } //条件(辺の長さについて)判断のおわり
}

ここまでを【PairMirror】にコピペし、追加分のKAMEのスクリプト前記事を参考に【KAME】にコピペすれば
とりあえず真夜中の合わせ鏡を見れる。


入れ子の構造
【真夜中の合わせ鏡】は、
 その中に(その中に(..(その中に(【ちょっと小さな四角】)が描かれた四角..)が描かれた四角)が描かれた四角
なんだけど、言い方を変えると、
 その中にちょっと小さな【合わせ鏡】が描かれた四角
でもある。このような形で表すことの出来るモノ、絵、構造、概念、モデル、...を【入れ子構造を持つXX】と呼ぶことがある。

前者の説明を素直にスクリプトで書くと、【無限】に長いスクリプトになってしまう。
一方、後者の説明を素直にスクリプトで書いたものが、上の例題。(こっちが簡潔でしょ?)

ただ、【入れ子構造】は【無限】が本質なので、ほんとに【素直】にスクリプトを書いちゃうと
あなたのPCが【逝ったきり】になってしまう。(いつかはメモリを使いきり、異常終了になる)
なので、どっかで止めてやらなければダメ。

例題も【見えない四角】になる前に、逝くのをやめさせている。

条件分岐
条件分岐は、
if(【真偽が決まる条件記述】){
【条件が真だったときにしたいこと】
} else {
【そうではないときにしたいこと】
}
のように記述する。
上の例では、


【真偽が決まる条件記述】は、len>10。
 見ての通り、「辺の長さlenの値が10より大きいかどうか」なので、真偽が決まる条件記述になっている。
   (一辺10の四角もみえるけど、これ以上描くと目が痛くなるので、ここらあたりがが順当)
これ以外に、xxx==yyy、xxx>=zzz、xxx!=yyy、や、それらのOR(論理和) xxx==yyy || xxx>=zzz
AND(論理積)xxx==yyy && xxx>=zzz、NOT(否定)!(xxx==yyy && xxx>=zzz)なんかの
組み合わせも、真偽が決まる条件記述。


【条件が真だったときにしたいこと】は、hidari(45)以下、ちょっと小さな【合わせ鏡】を描くこと
 { と } の間に、ちゃんと動くかどうかは別として好きなだけスクリプトを書ける。


【そうではないときにしたいこと】は、この例では無い。
 【条件が真だったときにしたいこと】のあとに【else {】を続けると、【そうではないときにしたいこと】を記述できる。
【条件が真だったときにしたいこと】と同様、else { と } の間に、ちゃんと動くかどうかは別として好きなだけスクリプトを書ける。


こんだけ
入れ子構造】の例は結構多い。キーワード「フラクタル」でググってみれば、情報は大量に入手できる。

Proce55ingで遊ぶ」の方にも書いているけど、再掲
 *usagi(),kame()の二つを追加。ゆっくり描かせられるようになったけど、ちょっと癖あり
 *「Proce55ingで遊ぶ」のほうで、習作披露予定

KAME2Dコマンド解説
usagi() : ウサギモード(超高速描画=いままでのモード)
kame() : 最高速カメモード(カメとしては高速:kami()はsetup()で)
kame(speed): カメモードのスピード指定(1が劇遅モード;同上)
mae(steps) : (線を描きながら)前にsteps歩進む
janpu(steps) :  (線を描かずに)前にsteps歩進む
hidari(degrees): degrees°左を向く
migi(degrees) : degrees°右を向く
koko() : いまの場所(と向き)を覚える(【忘れ】ない限りは覚えている)
sakki() : 最近覚えた場所(と向き)に戻ったあと、そのことを【忘れ】る
saisho(x,y,dir): 最初の場所と向きを決める。
mannaka() : ウィンドウの真ん中に移動する。
kesu() : 描いた絵を白色で消す。
kami() : 真っ白な新しい紙にかえる
kami(clr) : clr色の新しい紙にかえる
kami(r,g,b) : (r,g,b)色の新しい紙にかえる
iro(clr) : ペンの色をclrにする
iro(r,g,b) : ペンの色を(r,g,b)にする
iroai(h) : ペンの色合い(色相)をhにする。(0~255)
azayakasa(s) : ペンの鮮やかさ(彩度)をsにする。(0~255)
akarusa(b) : ペンの明るさ(明度)をbにする。(0~255)
futosa(width) : ペンの太さをwidthにする。(単位:ピクセル


なお、日本語サポートサイトからたどれるP5インフォメーション→言語が参考になる。
(解説してあるのは一昔前の版だから注意が必要だけど、loop()→draw()の読み替えだけで大抵OK)
山本徹(thoru)さんがFunProce55ingを始められました。(わくわく)
例題集は習作集と区別するためにこちらに置いた。
次は、【何しよう。KAMEコマンドの内部解説か?(リクエストありません?>keyさん】