爆発の判定

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

爆発の判定

#1

投稿記事 by AXL » 11年前

ある一点からの放射状に広がる円形の当たり判定を表現したいのですがどうしたらいいでしょうか?
障害物に衝突した場合、その後ろは判定させたくありません。

・A | ○B
例えば点Aに判定が無限に広がる爆弾があった時、壁|の向こう側にある円Bに判定させたくありません。
どういう方法が最適なのでしょうか?

①点Aから広がる複数の直線を爆発判定とする。→綺麗ではないし、距離やBの大きさによって安全地帯ができるためNG?
②安全地帯ができないぐらい敷き詰める→爆風の大きさによって線量が変わるためNG?
③点Aから広がる単純な円として円Bと判定して基準点A-B間に障害物がなかったらあたってる→自分より細い障害物で回避できそうなのでNG?

zxc
記事: 79
登録日時: 11年前
住所: 日本の背骨(?)あたり

Re: 爆発の判定

#2

投稿記事 by zxc » 11年前

  解決につながるか分かりませんが、障害物の端の点と点Aの接線を
利用する方法が以前掲示板に挙げられていたかと思います。

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

Re: 爆発の判定

#3

投稿記事 by GRAM » 11年前

2Dか3Dかで難易度がまるで異なります。
まずはそこですね。

2Dでそういったことをしたければそんなに難しくないと思いますが、次に考えることは形の複雑さです。

障害物が円、凸多角形、線分といった簡単な図形であれば、判定の例を示せますが、
凹んだ部分を含む多角形を認める場合は、あらかじめそれらを凸多角形に分解してやる必要があると思います。

自分の思いつく限り、判定方法は次のようなものです。
前の回答者さんが示している通り、爆心から障害物をつなぐ2半直線のうち、障害物内のすべての点が2半直線の間に収まるような
もっとも間の角度が小さい2つの半直線を求めればいいでしょう。
無題.png
無題.png (19.72 KiB) 閲覧数: 1919 回
今仮に爆心が各障害物の外部にあると仮定します

①障害物が線分の場合
   単純に線分の2つの端と爆心を結べばいいでしょう
②障害物が円の場合
   円の中心から2つの線分までの距離がちょうど半径になるという条件から方程式を解いて半直線の方向ベクトルを求めます  
③障害物が多角形の場合
   まず多角形の1頂点と爆心を結びます。そしてそのベクトルを90°回転させたベクトルを得ます
   次に各頂点と爆心を結んだベクトルを正規化し、最初のベクトルと内積をとります。
   内積が最も大きい頂点と、最も小さい頂点が求める2半直線上にある頂点です。
   これは図の右下を見ていただければなんとなくと思います。

あとは単純に2半直線間の間に物体があるかどうかを判定すればよいでしょう。
(円なら中心が半直線の間にあり、かつそれらまでの距離が半径以上、多角形ならすべての頂点が2半直線間にあればよい)
爆風を考慮するなら、これらの条件に爆風を表す円の内側に入っているかを付け加えるだけです。

3Dで正確さを求めるならスラブなどを使うのでしょうけれど、すこし難しいかもしれません。
少なくとも高速でかつ正確に判定する方法は僕にはちょっと思いつきませんね

AXL

Re: 爆発の判定

#4

投稿記事 by AXL » 11年前

GRAMさんの方法を色々試してみましたが四角が中々難しいですね・・・

閉鎖

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