#author("2019-04-26T08:41:28+09:00","default:takataka","takataka") #author("2019-05-07T11:22:05+09:00","default:takataka","takataka") *グラフィックス基礎及び実習 2019年度 実習第4回 [#hc4b2b41] &color(red){工事中}; //&color(red){工事中}; #contents **注意とおしらせ [#ann] - 実習のすすめ方 [[Graphics/2019/ex00]] - &color(#0000a0){この実習では,ls,cd,cpなどのUNIXのコマンドや,emacsというエディタを用います.これらの使い方を忘れた人は,次のページを参照しなさい:}; [[Docs/4UNIXBeginners]] **課題A(self) 完成目標: 今回の実習終了まで [#kadaiA] + 講義資料の「★2.8 インスタンス変数」,「★4.1 クラスとは」「★4.2 クラス変数とクラスメソッド」を読みなさい + 右のリンク先のPDFファイルを閲覧し,手書きの部分を講義資料に書き写しなさい.[[資料(学内アクセス限定)>Graphicsgakunai:scan2018-04-p2.pdf]] + 以前作成した T23.java を実際に改造して動作確認しなさい.(1) と (2) は,1つずつ追加して動作確認すること. &color(white,blue){check}; 次の文の空欄に入る言葉を答えなさい(白字で書いてあるので,当該箇所をマウスカーソル使って選択すると...).行番号は,講義資料に記載のものに合わせてある(行を追加するとずれるので注意). + 21行目の tScale と 22行の tColor はどちらも前に m2 が付いている.これは,m2 という変数が表す一匹のかめさんの情報を表す &color(white){インスタンス}; 変数である. + 19行目と20行目の間に追加した文では,&color(white){Turtle}; クラスの &color(white){ クラス };変数に値を代入している.そのため,全てのかめさんの状態が変化している. + 16行目の fd は,m1 という変数が表す一匹のかめさんを前進させる.このように個々のインスタンスに作用するメソッドを &color(white){インスタンス}; メソッドという. + 12行目と13行目の間に追加したメソッドは,&color(white){Turtle}; クラス全体に作用する &color(white){ クラス }; メソッドである.これにより,全てのかめさんの速さが変化する. **課題B(self) 完成目標: 今回の実習終了まで [#kadaiB] #ref(https://www-tlab.math.ryukoku.ac.jp/~takataka/course/Graphics/G04kamegameQ.png,nolink) 上記に示すソースプログラムに関する次の問題に解答しなさい. 実際にプログラムを作成&実行して修正を加えながら解答すること.解答はノートに書いたりソース中にコメントをつけたりする形で残しておくこと. +9行目を Color c = new Color(1.0, 1.0, 0.0, 1.0); と変更したとする.この時にプログラムを正しく動作させるために,2行目に文を追加したい.どのような文を追加したらよいか答えなさい. +右下に向かうかめを表すインスタンスを指しているのは,なんという名前の変数か +以下の4カ所にそれぞれ指定された処理を行うにはどのように書けばよいか答えなさい --A(15行目): speedAllメソッドを呼び出してかめの速さを低速にする --B(16行目): speedメソッドを呼び出して kame の速さを変える(引数には10を指定すること) --C(17行目): game の絵の大きさを 0.2 に変更する --D(21行目): withTurtleAllの値を変化させる +以下のアイウエにあてはまる文を上記のABCDから選んで答えなさい --ア:クラス変数に値を代入している --イ:クラスメソッドを呼び出している --ウ:インスタンス変数に値を代入している --エ:インスタンスメソッドを呼び出している **課題C(TA) 締切: 次回実習開始直後 [#kadaiC] #hr ''★ HogeTurtleクラスのAPI仕様'' HogeTurtleは,Turtleを拡張したクラス(「拡張したクラス」とはどういう意味かは次回学びます). - ''コンストラクタ'' Turtleクラスと同様なので説明は省略. - ''メソッド'' 以下のものの他,Turtle クラスのAPI仕様(p.13)に記されたメソッドも利用可能. > :void draw() | 現在のかめの位置でやつの絵を描く.やる気に応じて絵の描き方が少し変化する. :static void setBonusAll(int bonus) | 全てのかめのやる気を bonus だけアップさせる. < - ''フィールド'' 以下のものの他,Turtle クラスのAPI仕様(p.13)に記されたフィールドも利用可能. > :int yaruki | かめのやる気.0以下ならやる気なし,1なら普通,2以上なら数が大きいほどやる気あり.初期値は1. :static boolean rainbowAll | true ならペンを虹色に変化させる.false なら従来どおり.初期値は false. < #hr ***step0 [#hb9ca146] &ref(https://www-tlab.math.ryukoku.ac.jp/~takataka/course/Graphics/G04HogeTurtleQ.png); + 右のリンク先から HogeTurtle.class をダウンロードし,この科目のディレクトリに置きなさい.[[HogeTurtle.class>Graphics:HogeTurtle.class]] + 上記の内容の G04HogeTurtle.java を作成し,実行しなさい.3匹のかめが出てくるはず.G04HogeTurtle クラスは HogeTurtle クラスを利用するので,1. の作業が正しくできてないと「HogeTurtle の定義が見つからない」というエラーが出るだろう. ***step1 [#h6affcf6] G04HogeTurtle.java の 12, 15, 16行目にそれぞれ m1, m2, m3 のインスタンスメソッドを呼び出す文を書き,動作を確認しなさい.ただし,ここで呼ぶインスタンスメソッドは上記の HogeTurtle クラスのAPI仕様に示されたものとする. ***step2 [#gb37ad09] G04HogeTurtle.java の10,11行目にそれぞれ m2, m3 のインスタンス変数に値を代入する文を書き,動作を確認しなさい.ただし,m2 のやる気が 2 に,m3 のやる気が 0 になるようにすること. ***step3 [#ccab4eae] G04HogeTurtle.java の13行目にクラスメソッドを呼び出す文を書き,動作を確認しなさい.ただし,かめ全員のやる気が +3 されるようにすること. ***step4 [#k3e0278b] G04HogeTurtle.java の14行目にクラス変数に値を代入する文を書き,動作を確認しなさい.ただし,かめ全員のペンの色が虹色になるようにすること. **課題S(おまけ) [#kadaiS] //&color(Red){工事中}; #pre{{ import tg.*; public class G04Graph{ // クラス変数の宣言と初期化 public static final int WIDTH = 500; public static final int HEIGHT = 500; public static double XMAX = 1.0; public static double YMAX = 1.0; // 描画する関数 public static double f(double x){ return x*x; } // ピクセル単位のx座標の値(左端が0,右端がWIDTH)を // グラフのx座標の値(真ん中が0,左端が -XMAX,右端がXMAX)に変換 public static double toGraphX(int pixelX){ return XMAX * (double)(pixelX - WIDTH/2) / (WIDTH/2); } // グラフのy座標の値(真ん中が0,上端が YMAX,下端が-YMAX)を // ピクセル単位のy座標の値(上端が0,下端がHEIGHT)に変換 public static int toPixelY(double graphY){ return (int)(-graphY / YMAX * (HEIGHT/2)) + HEIGHT/2; } // mainメソッド public static void main(String[] args){ TurtleFrame f = new TurtleFrame(WIDTH, HEIGHT); Turtle m = new Turtle(); f.add(m); m.speed(5); // X軸を描く m.up(); m.moveTo(0, HEIGHT/2); m.down(); m.moveTo(WIDTH - 1, HEIGHT/2); // Y軸を描く m.up(); m.moveTo(WIDTH/2, 0); m.down(); m.moveTo(WIDTH/2, HEIGHT - 1); // 曲線を描く for(int px = 0; px <= WIDTH; px += 5){ double x = /* (a) px に対応するグラフの x 座標の値を求める */; int py = /* (b) グラフの y 座標の値を求め,それをピクセル単位の y 座標の値に変換する */; if(px == 0){ m.up(); m.moveTo(px, py); m.down(); }else{ m.moveTo(px, py); } } } } }} + 上記のプログラムを作成し,実行してみなさい.ただし,(a), (b) の箇所には,2つのクラスメソッド toGraphX, toPixelY のいずれかの呼び出しが入る.コメントを参考にそれぞれを書き,正しく動くようにしなさい.正しくできれば二次関数のグラフが描かれるはずある. + このプログラムの動作を理解し,説明できるようにしなさい. + このプログラムを修正して,下図のようなグラフが描かれるようにしなさい.ただし, -- 描画する関数が &mathjax{\sin(2\pi x)}; となるようにメソッド f を修正すること. -- ペンを虹色にするのは,Turtle クラスのかわりに HogeTurtle クラスを使うことで実現すればよい. -- main メソッド内は,上記の書き換えと HogeTurtle.rainbowAll = true; の追加以外にはいじらないこと. -- toGraphX, toPixelY メソッドも変更しないこと #ref(https://www-tlab.math.ryukoku.ac.jp/~takataka/course/Graphics/G04Graph.png,nolink) &size(14){少しFrameからはみ出すせいでかめは本当はスクロールバーに隠れるのだが,わかりやすくするためにウィンドウ幅を広げてキャプチャしてある.本当は,Frame の少し内側の領域だけに描画するように工夫するとよい.};