ソフトウェア演習Ⅱ〔課題 4:抽象クラスによる継承〕担当:青野雅樹

ソフトウェア演習Ⅱ〔課題 4:抽象クラスによる継承〕担当:青野雅樹
以下の内容を満たす Java プログラムと、その実行結果(今回は特別で PostScript ファ
イル)を Moodle にアップせよ。締切は 11 月 10 日(火)の夜までとする。第 4 回の資料
を参考にして、以下の項目すべてに対応すること。
(1) Color クラスからなる Color.java を作成せよ。ここには、メンバー変数として private
変数の r, g, b(赤、緑、青の色の三原色)を実数値として保持する。値はいずれも、
[0.0,1.0]の間の値をとる。
たとえば、r=g=b=1.0 なら色は「白」
、
r=g=b=0.0 なら「黒」、
その他は、たとえば r=g=1.0, b=0.0 なら「黄色」などで、いわゆる光の三原色を表
すとする。public なメソッドとして、getR(), getG(), getB()で、それぞれ、赤色成
分、緑色線分、青色成分を double 型で取り出す関数を作れ。
(2) Shape2D クラスに Color クラス変数を private で持たせること。public void
setColor(Color c)というプロトタイプを持つ関数を用意し、Color 変数に値をセット
できる関数を用意せよ。public Color getColor()というプロトタイプを持つ関数を作
成し、戻り値として Color 変数を返す関数を用意せよ。
(3) Triangle クラスには、そのコンストラクタに Color クラスの変数を加え、基底クラ
ス(Shape2D)の Color 変数にコンストラクタ内で値をセットできるようにする。同
時に、psPrint メソッド内に、色を PostScript で書き出す命令を追加すること。な
お、Color 変数は基底クラス(Shape2D クラス)だけに保持させること。すなわち、
Color 変数は、派生クラスの変数とせず、コンストラクタ内のパラメータとする。
(4) Rectangle(長方形)クラスを新たに、Shape2D クラスの派生クラスとして追加せ
よ。メンバー変数として、長方形の左下座標 v1 と右上座標 v2 を Coord2 変数で持
たせる。いずれも private 変数とする。これにも、
(3)で示した Color をコンスト
ラクタで設定できるようにし、psPrint メソッドも(3)と同様にせよ。面積計算と
周囲長計算を行う関数は(3)と同様に作成すること。
(5) Ellipse(楕円)クラスを新たに、Shape2D クラスの派生クラスとして追加せよ。メ
ンバー変数として、楕円の中心座標を Coord2 変数で持たせ、
他に横軸半径 radiusH、
ならびに縦軸半径 radiusV (ただし radiusH,radiusV>0, radiusH==radiusV のとき
は円) を持たせること。いずれも private 変数とする。Ellipse クラスにも、
(3)で
示した Color をコンストラクタでパラメータとして設定できるようにし、psPrint
メソッドも(3)と同様にせよ。なお、psPrint における楕円の描画方法は、後述の
コメント参照のこと。
(6) 全体の main 関数を含む ShapeInheritance.java には、Color に必要な赤、緑、青を
ランダムに発生する部分と、Triangle クラス、Rectangle クラス、Ellispe クラスを
生成する部分を加えること(資料にあった Circle クラスは Ellipse クラスに吸収さ
れるので不要)。図形の生成は、ループで、3の倍数なら三角形、3で割ったとき余
りが1なら長方形、余りが2なら楕円とすること。その他は、プログラム 4-6 と同
様とする。
(7) 実行にあたっては、乱数を 21~90 回の 3 の倍数回のループ数で与えること。
(8) PostScript のキャンバスは X 方向サイズを 600, Y 方向サイズを 800 とすること。
(9) PostScript の末尾に総面積の値、ならびに、総周囲長の値をコメント(先頭に%)
として書き出すこと。
PostScript 末尾例:
% 総面積 = 922620.9315248295
% 総長 = 430420.9102479208
showpage
提 出 は 、 Coord2.java, Shape2D.java, Triangle.java, Rectangle.java, Ellipse.java,
Color.java, ShapeInheritance.java, ならびに PostScript 出力の output.ps の合計 8 ファイ
ルで、これらを Zip や Tar 等のアーカイブ形式でまとめて提出すること。PostScript の先
頭に学籍番号と名前をコメントで入れることを忘れないこと。
コメントとヒント:
あくまで例ですが、Color 変数がコンストラクタに含まれた場合のコンストラクタ例を
紹介します。
public Ellipse(double radiusH, double radiusV, Coord2 v, Color c){
this.radiusH = radiusH;/* 横軸半径 Horizontal radius */
this.radiusV = radiusV;/* 縦軸半径 Vertical radius*/
this.v = v;/* 中心座標 */
super.setColor(c);/* 基底クラスの setColor メソッド */
}
ポイントは、基底クラスの setColor メソッドを呼出すとき、super という Java 特有の
親クラス変数を示すキーワードを使用する点です。色を与える PostScript コマンドは、
"r g b setrgbcolor"(例: 0.31 0.75 0.10 setrgbcolor)のようなコマンドで、この r, g, b の
代わりに、String の format メソッドで%3.2f 程度の変換で実数値を書き出せば結構で
す。
楕円を描画する PostScript は以下のような命令としてください。青色はパラメータで
可変な(実数値が入る)部分、黒色はそのままで変更する必要はありません。
% 楕円の描画 (cx,cy,radiusH,radiusV, ratio=radiusV/radiusH はパラメータ)
cx cy translate 1 ratio scale 0 0 radiusH 0 360 arc 1 1 ratio div scale ‐cx ‐cy translate stroke 意味は、楕円の中心(cx,cy)に移動し、そこを原点と思って楕円を描画します。その
際、横軸と縦軸半径の比率でスケーリング(拡大・縮小)を行い、最後に、(‐cx,‐cy)
だけ、平行移動する、という一連の PostcScript 命令で楕円が描画できます。色は先頭
に"r g b setrgbcolor"を付与すれば結構です。パラメータは psPrint 関数内で処理すれば
いいかと思います。
なお、楕円の面積は、   (radiusH)  (radiusV) で与えられます。また、楕円の周囲長
(perimeter = circumference)は、実はかなり難しい計算を要することが知られており、
Wikipedia にもある以下の近似式を利用してください。なお a  radiusH , b  raidusV と
します。
3h


Perimeter(ellipse)    a  b  1 

 10  4  3h 
a  b
h
2
 a  b
2
下図は n=21 でこの課題を実行した PostScript を表示した例です。