このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1267796762/48
#  【 課題 】ttp://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/959.zip 
#  【 形態 】1. Javaアプリケーション(main()で開始) or 2. Applet 
#  【 補足 】一つの物をつくるのですが、何回かに分けて提出です。pdfファイルを見ていただければわかると思います。 
# 問題:
# 一定の幅と高さをもつボードがある。図 1のようにボード上には左上隅を原点とする座標系
# (x座標、y座標)が定義されているとする。この時、つぎの条件を満たすように二辺の長
# さ(幅と高さ)と左上の位置を表す座標をもつ長方形をボード上に配置するプログラムを作
# 成せよ。座標系の単位はピクセルとする。ボードの大きさは最終版では指定したアプレットの
# 大きさに依存して決定する。CUIの場合には固定値でよい。例えば 600×500。
# (1)
# 配置に関する以下の操作を行うことができる。各操作の名前には下線が引かれている。
# a)幅、高さ、左上の位置(x座標、y座標)を与えて長方形を作成する。create
# b)長方形 Rを指定して、Rを現在位置から指定したx方向の距離 x 0,y方向の距離 y 0だけ移動する。move
# c)長方形 Rを指定して、指定した幅の倍率 mxで幅を、高さの倍率 myで高さをそれぞれ拡大または縮小する。倍率は有限小数で与えるものとする。幅・高さ・座標の値はMathクラスの roundメソッドを使用して決定する。expand/shrink
# d)長方形 Rを指定して削除する。delete
# e)ボード上の長方形をすべて削除する。deleteAll
# f) 2つの長方形 R1と R2を指定し、R1と R2の重なり部分を抽出し、新たな長方形 R3
# として配置する。intersect
# (2)
# その他に次の操作を行うことができる。
# a)ボード上の長方形を表示する。displayBoard
# ここで「ボード上の長方形を表示する」とはボード上にあるすべての長方形の属性(幅、
# 高さ、x 座標、y 座標)を表示する(標準出力に出力する)ということ。
# b) 配置に関する操作を終了する。 exit
# (3)
# ユーザはキーボード(標準入力)から(1)の操作名と必要なデータを入力し、プログラ
# ムが結果のボード上のデータ(どの位置にどの長方形が配置されているか)を標準出
# 力に出力する。このプログラムは以下のように使用することができる。
# a) 起動すると、操作一覧が表示される。
# b) ユーザは操作を選択し、要求されるデータを入力する。
# c) 操作の実行が終了すると、操作一覧に戻り、exit が実行されるまで操作を選択することができる。
# (4)
# 長方形に関する条件:
# a)ボード上で同じ幅、高さ、位置をもつ長方形は同一の長方形とみなす。
# b)今回は点および線分は長方形とはみなさない。
# c)ボード上に配置できる長方形の数の上限は 10とする。
# (5)
# 操作に関する条件:
# a)ある操作によって、ボードから長方形がはみ出す場合には、その入力の値を無効と
# して、操作をやり直す。
# b)操作が無効である場合は、適切なメッセージを出力する。
# (6)
# クラス構成に関する条件:
# RectangleEditor:mainメソッドをもつクラス
# Rectangle:長方形のクラス
# Board:長方形を配置するボードのクラス
# Command: ユーザからの入力を受け取り、長方形に対する操作を呼び出し、ボードの状
# 態を更新するクラス

長方形番号管理([]).

長方形番号追加(N) :-
        repeat,
        N is random,
        retract(長方形番号管理(L)),
        \+(member(N,L)),
        assertz(長方形番号管理([N|L])),!.

長方形番号削除(N) :-
        retract(長方形番号管理(L)),
        ならびから削除(N,L,L1),
        assertz(長方形番号管理(L1)),!.

'幅、高さ、左上の位置(x座標、y座標)を与えて長方形を作成する'(_幅,_高さ,_左上のx座標,_左上のy座標,_長方形) :-
        長方形番号追加(_長方形),
        assertz(長方形(_長方形,_幅,_高さ,_左上のx座標,_左上のy座標)).

'長方形 Rを指定して、Rを現在位置から指定したx方向の距離 x 0,y方向の距離 y 0だけ移動する'(R,X0,Y0,R2) :-
        長方形(R,_幅,_高さ,_左上のx座標,_左上のy座標),
        _左上のx座標2 is _左上のx座標 + X0,
        _左上のy座標2 is _左上のy座標 + Y0,
        '幅、高さ、左上の位置(x座標、y座標)を与えて長方形を作成する'(_幅,_高さ,_左上のx座標2,_左上のy座標2,R2).

'長方形 Rを指定して、指定した幅の倍率 mxで幅を、高さの倍率 myで高さをそれぞれ拡大または縮小する。倍率は有限小数で与えるものとする。幅・高さ・座標の値はMathクラスの roundメソッドを使用して決定する'(R,_mx,_my,R2) :-
        長方形(R,_幅,_高さ,_左上のx座標,_左上のy座標),
        _幅2 is round(_幅 * _mx),
        _高さ2 is round(_高さ * _my),
        '幅、高さ、左上の位置(x座標、y座標)を与えて長方形を作成する'(_幅2,_高さ2,_左上のx座標,_左上のy座標,R2).
        
'長方形 Rを指定して削除する'(R) :- 長方形番号削除(R).                

'ボード上の長方形をすべて削除する' :- abolish(長方形番号/1),assertz(長方形番号([])).

'2つの長方形 R1と R2を指定し、R1と R2の重なり部分を抽出し、新たな長方形 R3として配置する'(R1,R2,R3) :-
        長方形(R1,_幅1,_高さ1,_左上のx座標1,_左上のy座標1),
        長方形(R2,_幅2,_高さ2,_左上のx座標2,_左上のy座標2),
        _右上のx座標1 is _左上のx座標1 + _幅1,
        _右下のy座標1 is _左上のy座標1 + _高さ1,
        _右上のx座標2 is _左上のx座標2 + _幅2,
        _右下のy座標2 is _左上のy座標2 + _高さ2,
        重なる部分(_左上のx座標1,_右上のx座標1,_左上のx座標2,_右上のx座標2,X31,X32),
        重なる部分(_左上のy座標1,_右上のy座標1,_左上のy座標2,_右上のy座標2,Y31,Y32),
        _幅3 is X32 - X31,
        _高さ3 is Y32 - Y31,
        '幅、高さ、左上の位置(x座標、y座標)を与えて長方形を作成する'(_幅3,_高さ3,X31,Y31,R3),!.

ボード上の長方形を表示する :-
        長方形(_長方形,_幅,_高さ,_左上のx座標,_左上のy座標),
        write_formatted('長方形=%t,幅=%t,高さ=%t,左上のx座標=%t,左上のy座標=%t\n',[_長方形,_幅,_高さ,_左上のx座標,_左上のy座標]),
        fail.
ボード上の長方形を表示する.

重なる部分(X1,X2,X3,X4,X3,X2) :- X1 =< X3,X2 =< X4,!.
重なる部分(X1,X2,X3,X4,X3,X4) :- X1 =< X3,X2 >= X4,!.
重なる部分(X1,X2,X3,X4,X1,X4) :- X1 >= X3,X2 >= X4,!.
重なる部分(X1,X2,X3,X4,X1,X2) :- X1 >= X3,X2 =< X4,!.