ラベル ゲーム 交差判定 の投稿を表示しています。 すべての投稿を表示
ラベル ゲーム 交差判定 の投稿を表示しています。 すべての投稿を表示

2011年4月28日木曜日

交差判定 その3-2:矩形同士の交差判定

矩形同士の交差判定で前回とちょっと違った方法で判定する。

JavaのRectangleを使用して、contains()と言うメソッドを呼び出して判定する。

このcontains()メソッドは、『指定された位置 (x,y) にある点を含むかどうかを判定する』
と、Javaの説明に有る。

どういうことかと言うと、矩形の中に指定した矩形の点が入っていたらtrueを返す仕組み。



















今回はキー操作で動かす矩形を矩形1、動かさない矩形を矩形2として、
矩形2の中に矩形1が入ったら、trueを返す仕組みを作ってみる。


【trueを返す時にどの位置が入った時に返すか】

矩形2の左上、左下、右上、右下の4角に矩形1の4角が入ったらtrueを返すように設定する。
そして、左上、左下、右上、右下の4角を定数で設定しておく。
また、入っていない時の状況も考慮して、入っていない時の定数も合わせて作る。
設定する定数
入っていない時:NO_COLLISION=0
左上:UP_LEFT=1
左下:DOWN_LEFT=2
右上:UP_RIGHT=3
右下:DOWN_RIGHT=4

矩形の4角、それぞれの座標位置
4角の座標位置は以下の通り
左上:X,Y
左下:X,Y+HEIGHT
右上:X+WIDTH,Y
右下:X+WIDTH,Y+HEIGHT












最初に設定するものは、動かない矩形1の矩形の設定を行い、contains()メソッドを
使ってどの位置に入ったか、返す条件式を作成する
また、X,Y,WIDTH,HEIGHTをそれぞれしゅとくして変数に代入する

こんな感じ
Public int collision(Rect1 rect1) {
//動かない矩形2の設定
Rectangle rect=new Rectangle(X,Y,WIDTH,HEIGHT);
//X,Y,WIDTH,HEIGHTをそれぞれしゅとくして変数に代入
//型がint型だが、座標値を他の型で設定していてもキャストすれば問題ない
int rect1_X=rect1.getX();
int rect1_Y=rect1.getY();
int rect1_W=rect1.getWIDTH();
int rect1_HEIGHT=rect1.getHEIGHT();

//矩形2の左上から矩形1の右下が入ってきた場合
if(rect1.contains(rect1_X+rect1_W,rect1_Y+rect1_H)) {
return UP_LEFT;
}

//矩形2の左下から矩形1の右上が入ってきた場合
if(rect1.contains(rect1_X+rect1_W,rect1_Y)) {
return DOWN_LEFT;
}

//矩形2の右上から矩形1の左下が入ってきた場合
if(rect1.contains(rect1_X,rect1_Y+rect1_H)) {
return UP_RIGHT;
}

//矩形2の右下から矩形1の左上が入ってきた場合
if(rect1.contains(rect1_x,rect1_Y)) {
return DOWN_RIGHT;
}
//何にも無かった場合
return NO_COLLISION;
}














次に、位置を求めるメソッドを作成する。
switch文を使ってそれぞれの4角に対しての位置を求める。
こんな感じ
public void collisionDetection() {
//上記で作ったメソッドの返りを取得して
//変数に代入し、switch文で使用する
int collidePos=collision(rect1);
//NO_COLLISION以外の場合
if(collidePos!=NO_COLLISION) {
swicth(collidePos) {
case UP_LEFT:
//この中に入っていた時にどうするかの
//動作を記述する
break;

case UP_RIGHT:

break;

case DOWN_LEFT:

break;

case DOWN_RIGHT:

break;

default:
break;
}
}
}

これで、一通り完成。
今回は、一致した場所に交差したら、文字列を出力するようにした。

この作り方はAndroidでも利用できる。

Java Rectangleクラス
android reference rectクラス:containsメソッド




その他の交差判定
交差判定 その1:線と線
交差判定 その2:点と円の交差判定と円同士の交差判定
交差判定 その3-1:矩形同士の交差判定

その他の交差判定関連
Androidでゲーム ブロック崩し編 5回目:ボールと板の交差判定
Androidでゲーム ブロック崩し編 6回目:ボールとブロックの交差判定

交差判定 その3-1:矩形同士の交差判定

矩形同士の交差判定

2つの矩形があり、この2つの矩形を図のように交差させてみた時の
交差判定

2つの矩形








これを重ねる。


考えること。
XとYをそれぞれ個別に見て、そして、

①X1とX2+WIDTHの対角を比較する

条件式は
X1<=X2+WIDTH

②X2とX1+WIDTHの対角を比較

条件式は
X2<=X1+WIDTH

③Y1とY2+HEIGHTの対角を比較

条件式は
Y1<=Y2+HEIGHT

④Y2とY1+HEIGHTの対角を比較
Y2<=Y1+HEIGHT

これらの式をまとめると
if(X1 <= X2+WIDTH && X2 <= X1+WIDTH) &&
  (Y1 <= Y2+HEIGHT && Y2 <= Y1+HEIGHT) {
   //この中に、条件が一致した時の内容を記述する。
}

となる。




その他の交差判定
交差判定 その1:線と線
交差判定 その2:点と円の交差判定と円同士の交差判定
交差判定 その3-2:矩形同士の交差判定


その他の交差判定関連

2011年4月23日土曜日

交差判定                               その2:点と円の交差判定と円同士の交差判定

点と円の交差判定と円同士の交差判定

①点と円の交差判定

点を移動させて、円の中に入ったら交差していると判断する

点の座標をX0,Y0

円は、中心座標CX1,CY1
半径をr1とする。














交差しているかいないかの条件は、
円の中心座標と点の座標との距離が、円の半径以下なら交差と判断する。

この距離を求める方法が、三平方の定理を使ってX方向とY方向のそれぞれの距離を求める。

三平方の定理は
平面幾何学において直角三角形の斜辺の長さを c とし、その他の辺の長さを a, b とした時、




になる関係が、成立するという幾何学の定理。学校で習った物です。

点の座標と円の中心座標の距離をこの三平方の定理で求めると
(CX1-X0)*(CX1-X0)+(CY1-Y1)*(CY1-Y1)=r*r













と、なる。


交差判定なので、距離が半径以下となったら、交差していると判断するので
このようになる。

(CX1-X0)*(CX1-X0)+(CY1-Y1)*(CY1-Y1)<=r*r


②円同士の交差判定
円を2つ作って1つを移動させて、もう1つの円の中に入ったら交差していると判断する。

円同士の交差判定も、①で使った三平方の定理を使って判定を行う。

円1
中心座標:CX0,CY0
半径:r0
円2
中心座標:CX1,CY1
半径:r1














円1の中心座標と円2の中心座標の距離が円1の半径と円2の半径の
和以下なら交差していると判断する。

条件式に表すと
(CX1-CX0)*(CX1-CX0)+(CY1-CY0)*(CY1-CY0)<=(r1+r0)*(r1+r0)
と、なる。

条件式が成立していない時


















条件式が成立している時




















点と円の交差



円同士の交差


その他の交差判定
交差判定 その1:線と線
交差判定 その3-1:矩形同士の交差判定
交差判定 その3-2:矩形同士の交差判定


その他の交差判定関連

2011年4月20日水曜日

交差判定 その1:線と線

Androidの、線と線の交差判定について。
Androidに限らず、考え方は同じだと自分は思っている(経験上)


交差判定の前にAndroidの線について
Androidの線はCanvasクラスのgrawLine()メソッドを呼ぶ。

drawLineの引数は
drawLine(int x0,int y0,int x1,int y1,Paint paint)

引数の説明
x0・・・始点のX座標
y0・・・始点のY座標
x1・・・終点のX座標
y1・・・終点のY座標



今回、交差させる為に2本の線を描画し、1本はキー操作で移動させ、もう1本は、動かさないで固定させておく。






        

















                                        ルール




青い線と赤い線を用意する
青い線・・・Line_1
赤い線・・・Line_2
それぞれの始点終点の座標
始点X0,Y0
終点X1,Y1

とする。




こんな感じで交差したら、trueを返すようにしたい












交差判定は、どれとどれを比較して、それよりも大きいか、また、小さいかを見て判定する

それでは、比較する対象を列挙する
Line_1の始点とLine_2の始点
Line_1の終点とLine_2の終点

線同士の交差判定はこれだけでこれ以上は必要ない。

出来る限り解りやすくしたいから、細かい考え方は省略する。
ベクトルがどうとかなんて書きません。3Dじゃないので。

列挙した物をもう少し細かくして見る。
Line_1の始点はX0,Y0
Line_2の始点はX0,Y0

Line_2の終点はX1,Y1
Line_2の終点はX1,Y1

それでは、比較してみようと思う。
最初に比較する物は、Line_1の始点はX0,Y0とLine_2の始点はX0,Y0

図で、動かないLine_2の線と動くLine_1の線に対しての位置関係を考えると、
Xの場合は
Line_1の始点X0は、Line_2の始点X0の位置関係を見ると、座標値の大きさは
Line_1の始点X0の方が大きい
Yの場合は
Line_1の始点Y0は、Line_2の始点Y0の位置関係を見ると、座標値の大きさは
Line_2の始点Y0の方が大きい

と言うことが解る。
これを演算にして見ると
Line_1.X0>Line_2.X0
Line_1.Y0<Line_2.Y0
になる。

それで、同じ要領で、終点について考えてみると
Line_1の終点X0は、Line_2の終点X0の位置関係を見ると、座標値の大きさは
Line_2の終点X0の方が大きい
Yの場合は
Line_1の終点Y0は、Line_2の終点Y0の位置関係を見ると、座標値の大きさは
Line_1の終点Y0の方が大きい

と言うことが解る。
これを演算にしてみると
Line_1.X0<Line_2.X0
Line_1.Y0>Line_2.Y0
になる。

これを条件式にして見る。

と、その前に、どういうときに交差しているのか?
と言うことについて考えると、

上記の比較で得た内容全てが一致した時に交差していると判断したいので
この場合、演算子はANDを使う。

ANDは1と1の時、1を返し、それ以外は0を返す。

と言うことで、今度こそ、条件式にして見る。

if(((Line_1.X0>Line_2.X0)&&(Line_1.Y0<Line_2.Y0))&&((Line_1.X0<Line_2.X0)&&(Line_1.Y0>Line_2.Y0))) {
そして、交差したらtrueを返すようにフラグ変数にtrueを代入する内容を書く
}

これで、完成。

android reference:Line