/* 1)何を描こうとしたのか ? くさび形の二等辺三角形を一つの火花に見立てて、夜空に打ち上げられた五色の大輪花火が大きく広がっていく様子を表現しました 作成日 01.10.29 作成者 t01408ss(下山 聡) */ /* 2)ソースファイル */ import Turtle; class Hanabi2 extends Turtle{ /* startメソッド: タートルに描画を実行させる */ void start(){ // 花火を描く hanabi(); } /* hanabiメソッド: 火花を放射線状にならべて(24等分にしたチーズケーキのように)描くメソッド */ void hanabi(){ /* 同心円上の5層の”わっか”のように火花を並べる */ int i; for(i=1; i<=5; i++){ // わっかを5層描く /* 偶数番目の層は火花の数を少なくするため,場合分け(分岐)をする */ if(i%2 == 1){ wakka01(i); // 奇数番目の層(wakka01)を描く } else{ wakka02(i); // 偶数番目の層(wakka02)を描く } } } /* wakka01(奇数)メソッド: 火花(二等辺三角形)の先端(鋭角)を,花火の中心に向けて,ひとつずつ並べるメソッド 尚,中心の層から描きはじめ,外側の層に行くほど火花は多く並べる */ void wakka01(int i){ int n; for(n=1; n<=6*i; n++){ // i番目の層に並べる火花は,6×i個とする hibana(i); // i番目の層の火花を描く } } /* wakka02(偶数)メソッド: 上記の奇数wakkaメソッドの説明と同じ。ただ、火花の数を奇数層に比べて半分に減らす */ void wakka02(int i){ int n; for(n=1; n<=3*i; n++){ // i番目の層に並べる火花は,3×i個とする hibana(i); // i番目の層の火花を描く } } /* hibanaメソッド: 火花を一個描く */ void hibana(int i){ /* タートルの描きはじめの位置(花火の中心点から各層までの距離)の決定 */ int kyori; kyori = i-1; /* 第1層めの描きはじめは全く移動させず,2層め以降は次第に距離を増やしていく */ up(); fd(27*kyori); down(); // 描きはじめの位置へタートルを移動させる lt(15); // 描きはじめの角度の調整 // 火花(二等辺三角形)の3辺を順番に描く fd(27); rt(105); fd(14); rt(105); fd(27); rt(165); // 花火の中心点にタートルを戻らせる up(); bk(27*kyori); down(); // 次に描く火花のために,タートルの角度を調整する int p; p = 6*i; // ある層に並ぶ火花の個数 int angle; angle = 360/p; // 角度を割り出す(例えば第5層だったら,360/30=12度) // 奇数層と偶数層では並ぶ火花の個数が違うため,場合分け(分岐)する if(i%2 == 1){ rt(angle); // 奇数層の場合に,調整する角度 } else{ rt(angle*2); // 偶数層の場合には,2倍の角度にする } } /* 3)実現できたこと うまく火花のように見える,鋭角二等辺三角形をつくることができて良かった。角度から求めようとしても無理なことが分かり, 辺の長さをいろいろと仮定してみたら地道に割りだすことができた。 同心円上に火花をきれいに並べることができた。これは,火花を一つ描くごとに,タートルを中心点に戻すことで可能になった。 奇数層と偶数層の火花の個数を変化させることによって、花火に濃淡ができ、「五色の打ち上げ花火」のイメージが出せたとおもう。 実現できなかったこと 本当は火花をらせん状に広げたかった。そうすれば,滑らかに火花が散っていく様が描けたと思う。何度もタートルが中心点に戻るので, 描き上がっていく段階を見ていても,スピードが遅くてじれったい。何度も試行錯誤をしたが、らせん状にするためには, おそらくかなり複雑な計算が必要だと思う。 背景に三日月や天の川、冬の星座を描ければ,一目で花火だと分かってもらえたかも知れない 図形の下書きからはじめて,フローチャートをつくっているうちに分岐が必然的に必要になることが分かり,とてもうれしかった。 はじめて一から書き上げたプログラムが動いた時はとても感動しました。 */ }
> もとのページへ戻る