ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

IT技術初心者(気軽に質問できる)コミュのrectangleの問題(java)

  • mixiチェック
  • このエントリーをはてなブックマークに追加
二つの長方形の重なった部分の数値を表示するプログラムを
作ったところ思ったような実行結果になりませんでした、、
どこが間違っているのでしょうか?

どなたかご教授よろしくお願いします。

プログラム
-----------
class Rectangle{

final int INITIAL_WIDTH = 10;
final int INITIAL_HEIGHT = 20;
int width;
int height;
int x;
int y;

Rectangle(){
width = INITIAL_WIDTH;
height = INITIAL_HEIGHT;
int x = 0;
int y = 0;
}
Rectangle(int width, int height){
this.width = width;
this.height = height;
int x = 0;
int y = 0;
}
Rectangle(int w, int h, int x, int y){
this.width = width;
this.height = height;
this.x = x;
this.y = y;
}
void setLocation(int x, int y){
this.x = x;
this.y = y;
}
void setSize(int width, int height){
this.width = width;
this.height = height;
}
public String toString(){
return "["+x+", "+y+", "+width+", "+height+"]";
}
Rectangle intersect(Rectangle r){
int sx = Math.max(this.x, r.x);
int sy = Math.max(this.y, r.y);
int ex = Math.min(this.x + this.width, r.x + r.width);
int ey = Math.min(this.y + this.height, r.y + r.height);
int newwidth = ex - sx;
int newheight = ey - sy;
if(newwidth > 0 && newheight > 0){
return new Rectangle(sx, ex, newwidth, newheight);
}
else{
return null;
}
}
public static void main(String[] args){
Rectangle a, b, c, d, e;
a = new Rectangle(0, 0, 20, 10);
b = new Rectangle(5, 5, 20, 10);
c = new Rectangle(20, 10, 20, 10);
d = new Rectangle(-10, -20, 100, 200);
e = new Rectangle(21, 11, 20, 10);
Sytstem.out.println("a = " + a);
Sytstem.out.println("b = " + b);
Sytstem.out.println("c = " + c);
Sytstem.out.println("d = " + d);
Sytstem.out.println("e = " + e);
Sytstem.out.println("a と a の重なり = " + a.intersect(a));
Sytstem.out.println("a と b の重なり = " + a.intersect(b));
Sytstem.out.println("a と c の重なり = " + a.intersect(c));
Sytstem.out.println("a と d の重なり = " + a.intersect(d));
Sytstem.out.println("a と e の重なり = " + a.intersect(e));
}
}

コメント(1)

数学的な妥当性は、よくわかりませんが、
少なくとも、このコンストラクタ、
Rectangle(int w, int h, int x, int y){
this.width = width;
this.height = height;
this.x = x;
this.y = y;
}
は、不適当です。
引数のw, h, x, y は使用されていない状態です。
ですので、単なるwidthも、this.widthも
同じインスタンス変数widthを指しています。
Rectangle(int w, int h, int x, int y){
this.width = w; // width = w; でも可
this.height = h; // height = h; でも可
this.x = x;
this.y = y;
}
とすべきでしょう。
他のコンストラクタも同様な問題があります。
それから、
final int INITIAL_WIDTH = 10;
final int INITIAL_HEIGHT = 20;
は、staticを付けてクラス変数(定数)とした方がよいでしょう。
Rectangle(int width, int height){
this.width = width;
this.height = height;
int x = 0;
int y = 0;
}
のx, y は、データ型が書いてあるので、インスタンス変数を表していません。ローカル変数です。
ということは、コンストラクタ内で生まれて、直ぐ消えてしまう、ローカル変数で、効果がありません。
x = 0;
y = 0;
とすべきですね。とはいえ、int型のインスタンス変数のデフォルト初期値は、0ですから、これには実害がありません。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

IT技術初心者(気軽に質問できる) 更新情報

IT技術初心者(気軽に質問できる)のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング