本日の授業では,星形を描くプログラムに取り組んでもらいました.
開発言語はJavaです.Linuxのコマンドラインでコンパイルと実行をします.出力はSVGとし,背景色だけつけたSVG画像と,何枚かPNG画像を用意して,学生に参照できるようにしておきました.SVGはXML文書*1ですが,XML関連のJavaクラスは使用せず,単純にSystem.out.printなどで標準出力に書き出し,リダイレクションでファイルに保存することとしました.
PNG画像の1つは,次のものです.
最初のSVGファイルには,polygon要素を用いて背景を描くようにしていたので,同様にpolygon要素を加え,points属性の値を,星印になるよう指定すればいいわけです.
考え方は,こうです.画像の中心より(仮想の)円を描き,円周上で均等になるよう,5点を選びます*2.うち1点は,最も上,言い換えると円周上でY座標の値が最も小さい*3ものとすれば,すべての点が特定できます.
座標は三角関数を用いて計算できます.Javaでは,クラス定義の前に「import java.lang.Math;」と書いておきます.三角比でsin144°と表すような値は,Math.sin(Math.PI * 2 * 2 / 5)と記述します.
より具体的な座標設定や,ヒントとなる数式を,ホワイトボードに書き,コーディングさせてみると,何人かの学生が,次の星形をつくりました.
「少し,回転させなあかんのですが,どうするんですか?」と質問がありました.ゴールと出力とを見比べると,たしかに少し,回転させたいところです.おそらく18°なのですが,むしろ90°回転させるべきでしょう.sinとcosを入れ換えるという手もあります.
課題としては,Javaファイルのみを提出してもらいました.inkscape --without-gui --file=input.svg --export-png=output.pngというコマンドで,SVG画像をPNG画像に変換できることは,準備していたけれど,授業で話せませんでした.