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

0 件のコメント:

コメントを投稿