#author("2020-06-12T00:09:26+09:00","default:takataka","takataka")
#author("2020-06-12T00:13:54+09:00","default:takataka","takataka")
*グラフィックス基礎及び実習 2020年度 第10回 [#e9701092]
 
#contents
 
&color(#ff0000){''工事中''}; 
//&color(#ff0000){''工事中''}; 


**ex10 課題A [#kadaiA]

//&color(Red){''工事中''};

''提出期限: 0612金16:15''

この課題の情報は Teams 上で提示しています.

**ex10 課題B [#kadaiB]

//&color(Red){''工事中''};

''提出期限: 0612金16:50''

この課題の情報は Teams 上で提示しています.

**ex09 課題C [#kadaiC]
**ex10 課題C [#kadaiC]

//&color(Red){''工事中''};

''提出期限: 0611木23:59''
''提出期限: 0618木23:59''

教科書p.74の練習問題6.18をやりなさい(PTurtle).
ただし,次の手順でやること.
講義資料の Hello クラスを作りなさい.
完成したプログラムのソースファイルをこの科目の Moodle コース上の当該の場所へ提出すること.
- 上記ファイルは締切後に半自動的に処理します.コンパイルエラーになる,ファイル名が違う,といったことのないように注意すること.''ファイル名の間違い(大文字小文字も)に注意''.

+ 次のような仕様の PTurtle クラスを作る
-- PTurtle は Turtle のサブクラス
-- このクラスには,次の仕様のインスタンスメソッド draw と main メソッドのみ定義する.
>
:void draw(double[] path, double x, double y) | 折れ線 path を,折れ線の座標の原点が (x, y) に平行移動したものを描く.詳しくは教科書の該当箇所の説明(脚注40), 41)も)参照.
<
-- main メソッドの中身は次の通りとする.''コメントのつけ外し以外は,以下の内容を変更してはいけない.''
#pre{{
	// 例1
	double[] graph = { 50, 300, 100, 100, 300, 200, 350, 300 };
	// 例2 奇数個でも大丈夫?
	//double[] graph = { 50, 300, 100, 100, 300, 200, 350 };
	// 例3 長さ2のときは?
	//double[] graph = { 50, 300 };
	// 例4 長さ1のときは?
	//double[] graph = { 50 };
	// 例5 長さ0のときは?
	//double[] graph = { };
	// 例6 やつは?
	/*
	double[] graph = {
	    200, 175, 200, 100, 140, 100, 140, 120, 160, 120,
	    160, 100, 100, 100, 100, 175, 125, 175, 125, 150,
	    175, 150, 175, 175, 275, 175, 275, 150, 325, 150,
	    325, 175, 350, 175, 350, 100, 290, 100, 290, 115,
	    310, 115, 310, 100, 250, 100, 250, 175, 250, 100,
	    350, 100, 350, 300, 325, 300, 325, 275,  75, 275,
	    75, 250, 350, 250,  350, 300
	};
	*/
**ex10 課題S(omake)  [#kadaiS]

	TurtleFrame f = new TurtleFrame(800, 400);
	f.addMesh();
	PTurtle m = new PTurtle();
	f.add(m);
	m.speed(1);
	m.draw(graph, 0, 0);
	m.draw(graph, 400, 0);
}}
+ 例1, 例2が正しく動作するようにしよう.
-- draw を2回呼んでいるが,その間の移動時に線を引いてしまわないよう気をつけよう.
-- 配列 path の長さが奇数のときも正しく動作させるには → 配列の最後の値を無視するようにすればよい.ヒント(白字で書いてます):いろんなやり方がありますが,path の長さが奇数のとき,例えば 7 のとき,&color(white){ path.length / 2 }; の値は...で, &color(white){i = 1, 2 のとき 2*i と 2*i+1 は}; ...
+ 例3, 4, 5 が正しく動作するようにしよう.path の長さが2未満のときは,draw は何もせず return するようにすればよい.
+ 例6 で動作確認しよう.
+ 完成したプログラムのソースファイルをこの科目の Moodle コース上の当該の場所へ提出すること.
-- 上記ファイルは締切後に半自動的に処理します.コンパイルエラーになる,ファイル名が違う,といったことのないように注意すること.''ファイル名の間違い(大文字小文字も)に注意''.
//&color(#ff0000){''工事中''}; 

**ex09 課題S(omake)  [#kadaiS]
期限: 0619金23:59.これはおまけ課題です.やらなくても減点になりません.やったら加点かも

//&color(#ff0000){''工事中''}; 

期限: 0612金23:59.これはおまけ課題です.やらなくても減点になりません.やったら加点かも

複素数を扱うクラスを作ろう.
***step1 [#b5fa30c6]

以下のAPI仕様を満たす Complex.java と,Complexクラスの全てのメソッドを呼んで動作確認するmainメソッドを書いた G10exS.java を作る.
以下の仕様からわかるように,フィールドは非公開としよう

コマンドライン引数として2つの数を指定すると,下図のような図形を描くプログラムを作りなさい.
クラス名は G08Rainbow とし,次の要件を満たすようにすること.
''コンストラクタ''

+三角形毎に色を変える
+コマンドライン引数で三角形の数と斜辺の長さを指定する
:Complex(double re, double im) | re を実部の値,im を虚部の値にもつインスタンスを生成する
:Complex() | &mathjax{ 0 + 0i }; を値にもつインスタンスを生成する

1.については,Colorの配列を用いて実現すること(どんな色を使うかは自分で決めればよいが,色数は以下の例以上にすること).
実行結果の図が示すように,色を順番に使って使い果たしたらまた最初の色から順に使うようにすること.
''メソッド''

2.については,次のような動作を実現しよう.
#pre{{
$ java G08Rainbow 6 50   ← 引数を二つ指定すると図形を描く
:void setRe(double re) | このインスタンスの実部の値を re にする
:void setIm(double im) | このインスタンスの虚部の値を im にする
:double getRe() | このインスタンスの実部の値を返す
:double getIm() | このインスタンスの虚部の値を返す
:Complex add(Complex z) | このインスタンスに z を加えた新しいインスタンスを返す
:static Complex add(Complex z1, Complex z2) | z1 + z2 を返す

$ java G08Rainbow     ← 引数を指定しないと以下のメッセージを出して終了
使い方: java G08Rainbow r d
r: 三角形の数, d: 斜辺の長さ
ヒント: どちらのaddメソッドも,インスタンスの値を変更するものではないですね.new してそれを return したらよいでしょう.
***step2 [#o3dd8c02]

$ java G08Rainbow 6 50 hoge  ← 余分な引数を指定した場合も同様
使い方: java G08Rainbow r d
r: 三角形の数, d: 斜辺の長さ
Complexクラスを拡張したクラス Complex2 をつくろう.
このクラスは,次のようなものとすること.

$ java G08Rainbow 6 hoge  ← 引数が正しい形式でない場合も同様
使い方: java G08Rainbow r d
r: 三角形の数, d: 斜辺の長さ
}}
(1) コンストラクタの仕様はComplexと同じ

引数が正しい形式でない場合のチェックを行うには,Integer.parseInt() メソッドの例外処理を行えばよい.
教科書8.3節(p.93-)を参考にしよう.
(2) 次の仕様のメソッドを定義する
:String toString() | このインスタンスが表す複素数を String にして返す.戻り値の例は(注)へ.

(3) さらに次のようなものを計算するメソッドを追加しよう.乗算,絶対値,共役複素数.

注: 上記の toString メソッドは,Objectクラスで定義されているものを「再定義(オーバーライド)」することになります(教科書p.81参照).
System.out.printlnにオブジェクトを渡すと,そいつのtoStringを呼んで返ってきた文字列を使って表示してくれるので,こんなことができるようになります.
#pre{{
Complex2 z1 = new Complex2(2.0, 3.0);
Complex2 z2 = new Complex2(2.0, -3.0);
System.out.println(z1);                → 出力例:    2.0+3.0i
System.out.println(z2);                → 出力例:    2.0-3.0i
}}
***step3 [#jf8e8a47]

&ref(https://www-tlab.math.ryukoku.ac.jp/~takataka/course/Graphics/G06Rainbow-r06.png,nolink);
&ref(https://www-tlab.math.ryukoku.ac.jp/~takataka/course/Graphics/G06Rainbow-r12.png,nolink);
できあがった Complex2 クラスを使うプログラムを作り,動作確認しよう.
さらに,次の問の答えを計算してみよう.

&mathjax{ z = 2\cos{\frac{5}{3}}\pi + 2i \sin{\frac{5}{3}}\pi }; とおくとき,&mathjax{ z^6 }; はいくつか? 手計算の結果と比較すること.


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS