• 締切済み

2物体の衝突について

ただいま物理エンジン(2D)を作ろうとしています。 そこでどうしてもわからないことがありまして・・・ これは平面上のお話です。 線分AB、CDがあります。 各点の座標をA(a1,a2)、B(b1,b2)、C(c1,c2)、D(d1,d2)とします。 線分ABはE(e1,e2)を中心に毎秒fラジアンで、 線分CDはG(g1,g2)を中心に毎秒hラジアンで回転しております。 その上線分ABと点Eのセットは毎秒(i1,i2)の速度で、 線分CDと点Gのセットは毎秒(j1,j2)の速度で等速直線運動しております。 このとき、線分ABとCDは何秒後にぶつかるのか、もしくはぶつからないのか、 その解き方を教えてください。 よろしくおねがいします。。。

みんなの回答

回答No.4

改めて読み直してみたら、誤解があるようなので。 x 秒後って、1秒とか2秒とかに限定されないですよ。 0.1秒間隔でも、0.01秒間隔でも、「繰り返して」みれば いいわけです。わざわざ、繰り返し計算が取り柄の機械を 使うわけですから。 ※本当は、小さい単位で繰り返すと誤差の問題がでてくる けど。 ※あと、この程度の問題なら、それこそ Excel でおおざっ ぱに計算してロジックの確認くらいは、数時間でできると 思う。 あと、本当に初期段階なら、ぶつかったかどうかの判定で はなく、その時々の線分 AB と BC の距離も出力しましょ う。それをファイルに出力して、Excel でも(もっと専門 的なツールでも)使ってグラフにしてみれば、「このあた りでぶつかっていそう」というのはわかります。 そういう数値計算で、「あたり」をつけてから、きっちり やってみるというのも手です。 そういうのを試行錯誤といいます。 試行錯誤も計画的にやると、いろいろと勉強になります。

回答No.3

本当は、「ぶつからない」という判断もそんなに難しくありません。 まず、線分の動きから、回転中心点相互の距離が、 1)点Eと線分ABの中点までの距離+線分ABの長さの1/2 2) 点Gと線分CDの中点までの距離+線分Cdの長さの1/2 としたときに、1) + 2) を超えた場合、線分は交わらないことがわかります。 一方で、中心点、E, G の距離変化は、次の2パターンしかありません。 ・時間経過とともに、単調に増加する ・時間経過とともに、単調に減少し、最小点を通過すると、その後単調に増加する。 いずれにしても、距離の変化が「増加」に転じた後、「中心点が離れすぎた」ところで、 線分が交わらなければ、「ぶつからない」ということです。 ここまで、「やってみる」方式。 交わるかどうかだけでも判定したいというのであれば、中心点の移動だけに限定して、 調査するのも手です。 これだと、 点 E = (e1, e2) + t(i1, i2) 点 G = (g1, g2) + t(j1, j2) の距離(の自乗)を調べるだけですから、tに関する2次関数の微分だけでも、距離が 最短になる時間は決定できます。 このときの、E G の距離が、「ぶつかる」条件を満たさなければ「ぶつからない」(十分条件) 「ぶつかる」条件を満たすなら、その前後の t で、シミュレーションをすればいいかもしれません。

回答No.2

物理エンジンを作ろうという話であれば、「解く」というより、「やってみる」というのも手なのですが。 struct position { double x; double y; }; class lineType { private: position start; // 始点の座標 position end; // 終点の座標 position roteCenter; // 回転の中心座標 public: lineType(position aStart, position aEnd, position aRoteCenter); move(position pos); // pos の指定量移動する rote(double radian); // roteCenter を中心に radian だけ回転する friend boolisCoss(lineType a, lineType b); // a と b が接触しているかどうかの判断 // 接触判定に private メンバーが必要なので、friend 指定 }; bool isCoss(lineType a, lineType b) { この関数の実体はここに必要 } こんなのを作って、 lineType AB(positon(a1, a2), position(b1, b2), position(e1, e2); lintType CD(positon(c1, c2), position(d1, d2), position(g1, g2); に対して、 x sec 後の位置は、 AB.move(position(i1 * x, i2 * y); AB.rote(h * x); CD も同様にしたあと、 isCoss(AB, CD); で接触しているかどうか判定します。 そぞれぞれの計算は基本的なものですから、これを組み合わせて目的が達成できるのが、オブジェクト指向の有用なところです。 ただ、あくまでも、x秒後の様子を計算するだけなので、「実はぶつからない」という判断は、これだけではできません。 それぞれの line をビジュアルで表示できれば、見た目で判断できるとは思いますが。

RedHat3104
質問者

お礼

んー・・・ まあ初めそれを思いついたんですけど、 でももしかしたらx秒後以内にぶつかってx秒後には通りすぎてしまっている ということもなくはないかな?と考えまして。。。 しかし物体をクラスにまとめるってとこを参考にしようかなと思います。 >それぞれの line をビジュアルで表示できれば、見た目で判断できるとは思いますが。 コンピュータにそんな機能があればなぁ・・・

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

Cとは関係なく、数学の問題だと思うんですが.... 1)t(t≧0の実数)秒後の各座標をtを使って表現してみる。 例えば、R(θ)をθラジアンの回転行列だとすると、 t秒後Aの座標Atは At=(A-E)・R(f×t)+Et ここで、A,Eは初期座標、Etはt秒後のEの座標 2)線分AtBt,CtDtの交点を求める。 3) 2を満すtの実数解が存在すれば衝突する。 各式の意味や細かい計算は、物理エンジン作ろうというくらいだから、説明しなくても大丈夫ですよね?

RedHat3104
質問者

お礼

やはり行列が出てきましたか。。。 行列を勉強してからもう一度このご回答を見てみます。 ありがとうございました。

関連するQ&A

  • (Part.2)イラストレーターで任意半径の円(アクション機能)

    お世話になります イラストレーターで「任意半径の円」 適当な線分AB(直線)を描いて(いろいろな方向(角度)があります。) その線分ABを半径とし、中心Aの正円を描きたい。 (スマートガイド機能でピッタリと) 前の質問で http://oshiete1.goo.ne.jp/qa2949013.html こんな簡単なことが(笑)イラストレーターでは(案外)難しいことが 分かりました。 代わる案をアクション機能として登録できないかと考えています。 1.線分ABとは別に水平線CDを描く 2.CDを移動してC(またはD)をAに合致させる。 3.C(A)を中心としてCDを回転する。このときD(またはC)をドラッグして  点Bに合致させることが重要。 (※これで回転角度が記憶された。) 4.CDを消す。 5.中心Aの正円Pを適当に描く。 6.5.で描いた正円Pを回転ツールで中心A、3.で記憶された角度で回転させる。 7.正円Pの円周がBにぴったりあうように、中心Aで拡大・縮小させる。 アクション終了 CDを消すのは(順序的に)必ずしも4.でなくとも構いません。 最終的に消えればいいです。 簡単に理想を言えば、 a.線分ABが選択されている。 b.アクションを起動させる。 c.線分ABを半径とし、中心Aの正円を描く。 これをできるようにしたいです。 よろしくお願いします。

  • 円弧の半径

    円弧の始点A、終点B、線分ABの垂線と交わる円弧上の点C、線分ABの中心点D、中心点O としたとき、線分AB、CDが求まれば円弧の半径Rが求まると思うんですがどういった式になるのでしょうか R = AB*AB / (8*CD) + CD/2 上の式でいけると聞いたことがあるのですが なんの公式を使えばこうなるのかわかりません できればなにを基に式の変形すればよいか宜敷御願いします。

  • 複素数平面の問題です。

    z=x+yi(y≠0)と与えられており、かつ1,z,z^2,z^3はそれぞれ異なるとします。 A(1),B(z),C(z^2),D(z^3),E(z^4)とそれぞれ置かれています。 線分ABと線分CDが両端以外で交わるときに、線分DEと線分BCも必ず交わるということを示したいですが、どなたかわかりますか?

  • 物体の衝突する高さ

    地面から初速度vで物体Aを鉛直上方に投げ上げる。Aが最高点に達した瞬間に別の小物体BをAと同じ位置から初速度vで鉛直上方に投げ上げたところ、AとBが衝突した。重力加速度の大きさをgとする。 (1)小物体Aを投げ上げた時刻を0とする。AとBガ衝突するまでの時刻tにおけるAの速度はいくらか。ただし、鉛直上向きを正とする。 (2)Aが達する最高点の高さはいくらか。 (3)Bを投げ上げた後AとBが衝突するまでの間において、Bに対するAの速さについて、横軸を時間、縦軸を早さとしたグラフはどうなるか。 (4)AとBが衝突する高さhはいくらか。 (1)-(3)までは分かるのですが、(4)がよくわかりません。 BからみたらAはh(m)を等速vで近づく。衝突する時刻をt1とすると、t=t1のとき、AはBのところへくるからt1=h/vである…。 と書いてあったのですが、よく理解できません。 BからみたらAはh(m)を等速vで近づく。というのがよく分かりません。あと、t1=h/vもよく分かりません。衝突する時刻に高さがhとは限らないのに、どうして式にhがでてくるのでしょうか。

  • 中学三年数学です

    教えてくださいお願いします 長さが10の線分ABを直径とする半円周上に、線分ACの長さが6となるような点Cをとる。CからABへひいた垂線とABとの交点をDとし、Cにおける円の接線と、BAの延長線との交点をEとする。 (1)CDの長さを求めよ。 (2)∠ABC=a°とするとき、∠CEBをaの式であらわせ。 (3)AEの長さを求めよ。

  • 文章問題

    四角形ABCDは、AB=4cm、BC=3cmの長方形で、対角線DBを引き、辺CD上にCE=1cm(点Cから1cm)となる点Eをとる。 点Pは線分AB上にあり、点Aを出発して、毎秒1cmで点Bまで動くものとする。また、 点Qは対角線DB上にあり、点Bを出発して、毎秒2cmで点Dに行き、点Eまで動くものとする。2点P、Qが同時に出発してからt秒後の△APQの面積Scm^2とする。 (1)0≦t≦5/2のとき、Sをtの式で表しなさい。 (2)5/2≦t≦4のとき、Sをtの式で表しなさい。 (3)△APQで、∠APQが直角になるときのtの値を求めなさい。 と言う問題です。 まったく、わからなかったです。 私の考えは、点Qから線分ABへの垂線の長さを考えのですが、あらわすことができませんでした。 このような、問題の導き方を教えてください。できれば、解説もあるとうれしいです。 すいませんがよろしくお願いします。

  • 物体の衝突問題

    時刻t=t0において、質点と見なせるような物体Aを位置(-a,H)から 初速度(V0,0)で発射し、それと同時に、物体Bを位置(a,H)から 初速度(-V0,0)で発射する。時間t0<t<t1の間、物体は互いに影響することなく重力のみを受けて運動し、そのあと時刻t=t1において衝突し合体する。 (a)重力加速度ベクトルをG=(0,-g)とする。 衝突直前のAおよびBの速度を求め、V0,a,gであらわせ。 (b)衝突によりAとBは合体し、ひとつの物体となって運動した。 合体直後の速度は(V1cosθ,-V1sinθ)であった。AとBの重心はどのような 軌跡を描くか考察し(衝突前も含む)、その概略を図示せよ。 この問題で (a)で自分の解答は 衝突直前のAの速度は Va=(V0,-gt) Bの速度は Vb=(-V0,-gt) となったんですが この問題の考え方が分からなかったので教えてほしいです。 これは外力がなしになって、運動量は保存するのでしょうか。 (b)も同様に 運動量保存から求めるのか、そうでないのか 教えてほしいです。 またどのような解になるのか教えてほしいです。

  • 物体の衝突

    大学受験問題です。よろしくお願いします。 水平な地面上のP地点から質量Mの小物体Aを鉛直に打ち上げ、同時にQ地点から質量mの小球Bを打ち上げる。小球Bの打ち上げ角度αとPQ間の距離lは変化させることができる。小物体Aの打ち上げの初速度の大きさをV、小球Bの初速度の大きさをvとする。また、重力加速度の大きさをgとし、空気による抵抗は無視する。 BをAに衝突させるには、角度αをいくらにしなければならないか。sinαを求めよ。 私は、 Aのt秒後のx座標=Bのt秒後のx Aのt秒後のy座標=Bのt秒後のy なので、 (x軸方向) l=v(cosα)t cosα=l/vt-----☆ (y軸方向) Aについて・・・y=Vt-(1/2)gt^2 Bについて・・・y'=vsinαt-(1/2)gt^2 A=Bより V=vsinα sinα=V/v-----★ ☆と★より、 tanα=tV/l sinα=tV/lcosα、としました。 ですが、解答では、 AとBが衝突する場合、A、Bは同じ座標に同じ時刻に到達しなければならない。その場合、鉛直方向について考えれば、同時に投げ出すため、鉛直方向の初速度が同じでなくてはならない。ここで、それぞれの初速度のy成分より、 vsinα=V とあります。 ですが、これだとx軸方向が考慮されていないことになりませんか? 高さは同じでも、x座標が違うかもしれず、それだと衝突しないと思います。 また、答えには、「鉛直方向の初速度が同じでなくてはならない」とありますが、どうしてでしょうか。 以上、よろしくお願い致します。

  • 多脚場について

    多脚場の定義 g_{μν}=e^a_μ η_{ab} e^b_ν から局所Lorentz変換Λ^a_b(η_{ab}Λ^a_cΛ^b_d=η_{cd}) を用いて変換した e'^a_μ=(Λ^(-1))^a_b e^b_μ も定義を満たすことが示せません。どのように計算したら良いのでしょうか?

  • 数1 図形の問題の解答お願いします H24.07

    下記が問題文です。【1】~【5】が問題箇所です。 出来れば問題の解答の解説も付けて頂けると嬉しいです。 *図は画像を参照してください。 図のように、円周上に4点A、B、C、Dがある。 線分ACと線分BDは点G垂直に交わり、 点Aから辺CDに垂線AFをおろし、この垂線と線分BDとの交点をEとする。 また、AF=8、DC=10、GC=6である。 (1) 線分DGの長さは、DG=【1】である。 このとき、線分AGの長さは、AG=【2】である。 (2)線分ABの長さは、AB=【3】であり、BDの長さは、BD=【4】である。 (3)△DCGの面積は△AEBの面積の【5】倍である。

専門家に質問してみよう