円形と四角の当たり判定

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
jorujo

円形と四角の当たり判定

#1

投稿記事 by jorujo » 9年前

今アクションゲームをcとDxライブラリで作ってるものですが、
ゲームを作ってる上で、つまずいてしまったので、皆様の知恵を
借りたいと思い質問させていただきました。
と言うのも、円形と四角の当たり判定がわかりません。
どうすればよいのでしょうか?

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 円形と四角の当たり判定

#2

投稿記事 by みけCAT » 9年前

jorujo さんが書きました:円形と四角の当たり判定がわかりません。
まず確認したいことがあります。
・ユークリッド平面での話ですよね?
・「四角」は「各辺がx軸またはy軸に平行な長方形」などに限定しない、一般の四角形ですね?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

jorujo

Re: 円形と四角の当たり判定

#3

投稿記事 by jorujo » 9年前

みけCATさん返信ありがとうございます。
不十分な点が多かったようなので捕捉させていただきます。
2Dのゲームを作ろうと思ってます。
四角とは、正方形の事です。
x軸またはy軸に平行です。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: 円形と四角の当たり判定

#4

投稿記事 by Dixq (管理人) » 9年前

うちのサイトで紹介している長方形と円のあたり判定を参考にしてください。
http://dixq.net/rp/34.html

jorujo

Re: 円形と四角の当たり判定

#5

投稿記事 by jorujo » 9年前

Dixq (管理人)さん返信ありがとうございます
リンク先を読んでみたのですが、
僕には少し難しかったです。
出来ればほかの方法とかないでしょうか?

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: 円形と四角の当たり判定

#6

投稿記事 by Dixq (管理人) » 9年前

リンク先にソースコードが全部書いてあるのでコピペして使えばいいですよ。
もうこんな計算式見るのも嫌だというならブラックボックス化して関数だけ表に見えるようにして使っても良いと思います。
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成分が出る」ってことだけ覚えて利用しています。

jorujo

Re: 円形と四角の当たり判定

#7

投稿記事 by jorujo » 9年前

遅くなりましたが、返信ありがとうございます。
リンク先のやり方がわかるまで頑張りたいと思います。
ありがとうございました。

アバター
usao
記事: 1889
登録日時: 11年前

Re: 円形と四角の当たり判定

#8

投稿記事 by usao » 9年前

もう遅いかもですが…

効率はどうあれ,もっと話が直感的で簡単と思われる方法(の考え方)を提示しておきます.
別に判定手順とかはこの通りでなくても限りません.
添付ファイル
Box_vs_Circle.png
Box_vs_Circle.png (58.37 KiB) 閲覧数: 10642 回

アバター
GRAM
記事: 164
登録日時: 13年前
住所: 大阪

Re: 円形と四角の当たり判定

#9

投稿記事 by GRAM » 9年前

おそらく最も簡単な方法(?)は、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 であれば衝突しています。
このやり方は最後の判定を省略できる場合がありますが、とりあえず確実に動きます。

アバター
usao
記事: 1889
登録日時: 11年前

Re: 円形と四角の当たり判定

#10

投稿記事 by usao » 9年前

>GRAMさん

長方形の外周と円との判定が簡潔に書けそうですが,
・円が長方形の内部にあるかどうか
の判定が別途必要であるように思います.
( (P,Q)と(x,y)のどちらが(0,0)に近いか とかを見ればいいのかな? )

アバター
usao
記事: 1889
登録日時: 11年前

Re: 円形と四角の当たり判定

#11

投稿記事 by usao » 9年前

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 );
}

アバター
GRAM
記事: 164
登録日時: 13年前
住所: 大阪

Re: 円形と四角の当たり判定

#12

投稿記事 by GRAM » 9年前

>>usaoさん
長方形内部に円がある場合は単に距離が0になります。(P=x Q=y)
長方形領域内の最近傍点とはそういう意味を含んでいます(紛らわしかったらすみません)
(最後の判定式は問題ないです)
その場合をより高速に判定するならば
フラグを立てといて衝突としてしまうのが考えられます(これは四隅が最近傍点にならない場合も同様)
最後の計算が重い(というほどでもないが)ととらえるのならば、四隅が最近傍点にならない場合2乗をしない
高速な計算方法はありますが(それが最後の計算を省ける場合があるといった最後のコメントです)
この程度の計算は多くの場合気にするほどじゃないと思います。(質問者さんが計算リソースが十分にない場合は考えてみてください)
最後に編集したユーザー GRAM on 2015年3月03日(火) 18:36 [ 編集 1 回目 ]

アバター
usao
記事: 1889
登録日時: 11年前

Re: 円形と四角の当たり判定

#13

投稿記事 by usao » 9年前

>長方形内部に円がある場合は単に距離が0になります。(P=x Q=y)

あ,そうなってますね.
読み違えていました.失礼しました.

閉鎖

“C言語何でも質問掲示板” へ戻る