円形と四角の当たり判定
円形と四角の当たり判定
今アクションゲームをcとDxライブラリで作ってるものですが、
ゲームを作ってる上で、つまずいてしまったので、皆様の知恵を
借りたいと思い質問させていただきました。
と言うのも、円形と四角の当たり判定がわかりません。
どうすればよいのでしょうか?
ゲームを作ってる上で、つまずいてしまったので、皆様の知恵を
借りたいと思い質問させていただきました。
と言うのも、円形と四角の当たり判定がわかりません。
どうすればよいのでしょうか?
Re: 円形と四角の当たり判定
まず確認したいことがあります。jorujo さんが書きました:円形と四角の当たり判定がわかりません。
・ユークリッド平面での話ですよね?
・「四角」は「各辺がx軸またはy軸に平行な長方形」などに限定しない、一般の四角形ですね?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 円形と四角の当たり判定
みけCATさん返信ありがとうございます。
不十分な点が多かったようなので捕捉させていただきます。
2Dのゲームを作ろうと思ってます。
四角とは、正方形の事です。
x軸またはy軸に平行です。
不十分な点が多かったようなので捕捉させていただきます。
2Dのゲームを作ろうと思ってます。
四角とは、正方形の事です。
x軸またはy軸に平行です。
- Dixq (管理人)
- 管理人
- 記事: 1661
- 登録日時: 13年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: 円形と四角の当たり判定
うちのサイトで紹介している長方形と円のあたり判定を参考にしてください。
http://dixq.net/rp/34.html
http://dixq.net/rp/34.html
Re: 円形と四角の当たり判定
Dixq (管理人)さん返信ありがとうございます
リンク先を読んでみたのですが、
僕には少し難しかったです。
出来ればほかの方法とかないでしょうか?
リンク先を読んでみたのですが、
僕には少し難しかったです。
出来ればほかの方法とかないでしょうか?
- Dixq (管理人)
- 管理人
- 記事: 1661
- 登録日時: 13年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: 円形と四角の当たり判定
リンク先にソースコードが全部書いてあるのでコピペして使えばいいですよ。
もうこんな計算式見るのも嫌だというならブラックボックス化して関数だけ表に見えるようにして使っても良いと思います。
int hitjudge_square_and_circle(pt_t pt[4], pt_t rpt, double r);
/* pt[4]が四角形の頂点、rptが円の中心、rが円の半径 */
に値を入れて帰って来た値が0か否かを計算すればいいだけです。
後は全部コピペで見なかったことにすればOKです。
現にSTGを作っている小学生などはそんな感じで作っています。
もちろん彼らはまだsin,cosの仕組み等知りませんが、「sinΘをかければy成分が出る」ってことだけ覚えて利用しています。
もうこんな計算式見るのも嫌だというならブラックボックス化して関数だけ表に見えるようにして使っても良いと思います。
int hitjudge_square_and_circle(pt_t pt[4], pt_t rpt, double r);
/* pt[4]が四角形の頂点、rptが円の中心、rが円の半径 */
に値を入れて帰って来た値が0か否かを計算すればいいだけです。
後は全部コピペで見なかったことにすればOKです。
現にSTGを作っている小学生などはそんな感じで作っています。
もちろん彼らはまだsin,cosの仕組み等知りませんが、「sinΘをかければy成分が出る」ってことだけ覚えて利用しています。
Re: 円形と四角の当たり判定
もう遅いかもですが…
効率はどうあれ,もっと話が直感的で簡単と思われる方法(の考え方)を提示しておきます.
別に判定手順とかはこの通りでなくても限りません.
効率はどうあれ,もっと話が直感的で簡単と思われる方法(の考え方)を提示しておきます.
別に判定手順とかはこの通りでなくても限りません.
- 添付ファイル
-
- Box_vs_Circle.png (58.37 KiB) 閲覧数: 10642 回
Re: 円形と四角の当たり判定
おそらく最も簡単な方法(?)は、usaoさんの方法を若干改良したものでしょう。
長方形の対角線の交点座標(長方形の中心を)を(0,0)
x方向の長さをA 、y方向の長さをB、
円の中心を(x,y)半径をrとします。
解き方としてはusaoさんの示すやり方とほぼ同じで要は
長方形と円のあたり判定の問題⇒長方形から円の中心点までの距離の問題とします。
要は長方形から点までの距離がr以下であれば終わりです。
usaoさんのと違うのは領域問題にしないのと、R付の長方形を考えないことです。
(ただしR付の長方形の考え方自体はこの場合以外でも必要になることがあるので大事だとは思います)
長方形の領域内にある円の中心までの最近傍点を見つけます。
①一番近い点のx座標P
x<=-A/2 ならP=-A/2,
x>=A/2 ならP=A/2
それ以外ならP=x
②一番近い点のy座標Q(xと同様)
y<=-B/2 ならQ=-B/2,
y>=B/2 ならQ=B/2
それ以外ならQ=y
最近傍点(P,Q)が求まったのであとは(P,Q)と(x,y)との距離を求めればいいです。
(P-x)^2+(Q-y)^2 <= r^2 であれば衝突しています。
このやり方は最後の判定を省略できる場合がありますが、とりあえず確実に動きます。
長方形の対角線の交点座標(長方形の中心を)を(0,0)
x方向の長さをA 、y方向の長さをB、
円の中心を(x,y)半径をrとします。
解き方としてはusaoさんの示すやり方とほぼ同じで要は
長方形と円のあたり判定の問題⇒長方形から円の中心点までの距離の問題とします。
要は長方形から点までの距離がr以下であれば終わりです。
usaoさんのと違うのは領域問題にしないのと、R付の長方形を考えないことです。
(ただしR付の長方形の考え方自体はこの場合以外でも必要になることがあるので大事だとは思います)
長方形の領域内にある円の中心までの最近傍点を見つけます。
①一番近い点のx座標P
x<=-A/2 ならP=-A/2,
x>=A/2 ならP=A/2
それ以外ならP=x
②一番近い点のy座標Q(xと同様)
y<=-B/2 ならQ=-B/2,
y>=B/2 ならQ=B/2
それ以外ならQ=y
最近傍点(P,Q)が求まったのであとは(P,Q)と(x,y)との距離を求めればいいです。
(P-x)^2+(Q-y)^2 <= r^2 であれば衝突しています。
このやり方は最後の判定を省略できる場合がありますが、とりあえず確実に動きます。
Re: 円形と四角の当たり判定
>GRAMさん
長方形の外周と円との判定が簡潔に書けそうですが,
・円が長方形の内部にあるかどうか
の判定が別途必要であるように思います.
( (P,Q)と(x,y)のどちらが(0,0)に近いか とかを見ればいいのかな? )
長方形の外周と円との判定が簡潔に書けそうですが,
・円が長方形の内部にあるかどうか
の判定が別途必要であるように思います.
( (P,Q)と(x,y)のどちらが(0,0)に近いか とかを見ればいいのかな? )
Re: 円形と四角の当たり判定
GRAMさんのをヒントにして書いてみました.
//(cx,cy)は,長方形の中心を原点とした 円の中心座標
//円の半径をr
//長方形の縦横のサイズを hW*2,hH*2 とする
//((hW,hH,rは全て正の値であること)
bool Rect_vs_Circle_CollisionCheck( double hW, double hH, double cx, double cy, double r )
{
cx = fabs( cx );
cy = fabs( cy );
if( cx <= hW ){ return ( cy<=hH+r ); } //辺の内側?
if( cy <= hH ){ return ( cx<=hW+r ); } //辺の内側?
//角との判定
double dx = cx - hW;
double dy = cy - hH;
return ( dx*dx + dy*dy <= r*r );
}
Re: 円形と四角の当たり判定
>>usaoさん
長方形内部に円がある場合は単に距離が0になります。(P=x Q=y)
長方形領域内の最近傍点とはそういう意味を含んでいます(紛らわしかったらすみません)
(最後の判定式は問題ないです)
その場合をより高速に判定するならば
フラグを立てといて衝突としてしまうのが考えられます(これは四隅が最近傍点にならない場合も同様)
最後の計算が重い(というほどでもないが)ととらえるのならば、四隅が最近傍点にならない場合2乗をしない
高速な計算方法はありますが(それが最後の計算を省ける場合があるといった最後のコメントです)
この程度の計算は多くの場合気にするほどじゃないと思います。(質問者さんが計算リソースが十分にない場合は考えてみてください)
長方形内部に円がある場合は単に距離が0になります。(P=x Q=y)
長方形領域内の最近傍点とはそういう意味を含んでいます(紛らわしかったらすみません)
(最後の判定式は問題ないです)
その場合をより高速に判定するならば
フラグを立てといて衝突としてしまうのが考えられます(これは四隅が最近傍点にならない場合も同様)
最後の計算が重い(というほどでもないが)ととらえるのならば、四隅が最近傍点にならない場合2乗をしない
高速な計算方法はありますが(それが最後の計算を省ける場合があるといった最後のコメントです)
この程度の計算は多くの場合気にするほどじゃないと思います。(質問者さんが計算リソースが十分にない場合は考えてみてください)
最後に編集したユーザー GRAM on 2015年3月03日(火) 18:36 [ 編集 1 回目 ]
Re: 円形と四角の当たり判定
>長方形内部に円がある場合は単に距離が0になります。(P=x Q=y)
あ,そうなってますね.
読み違えていました.失礼しました.
あ,そうなってますね.
読み違えていました.失礼しました.