• ベストアンサー

ボール同士の衝突

2個のボールが衝突したときのおかしな挙動に困っています。 ちゃんと跳ね返るときもあれば、 いきなり高速移動する くっついたまま離れない。 以下が衝突時の関数です。 アドバイス等お願いします。 bool NearBall=false; void CBallBallView::BallCounter(CPoint *Pos1,CPoint *Pos2,int Radian1,int Radian2,Vector *Vec1,Vector *Vec2,double *SinB,double *CosB,double *SinD,double *CosD) { int Width=Pos1->x-Pos2->x; int Height=Pos1->y-Pos2->y; if(Width==0){return;} if((Radian1+Radian2)*(Radian1+Radian2)>=Width*Width+Height*Height &&NearBall==false) { double Cos=Width/sqrt((double)(Height+Width)*(Height+Width)); double Sin=Height/sqrt((double)(Height+Width)*(Height+Width)); double Tan=Sin/Cos; double tmpCos1; double tmpSin1; double tmpCos2; double tmpSin2; double SinA=*SinB; double CosA=*CosB; double SinC=*SinD; double CosC=*CosD; tmpCos1=(2*Cos*Cos-1)*CosA+2*Sin*Cos*SinA; tmpSin1=2*Sin*Cos*CosA-(2*Cos*Cos-1)*SinA; tmpCos2=(2*Cos*Cos-1)*CosC+2*Sin*Cos*SinC; tmpSin2=2*Sin*Cos*CosC-(2*Cos*Cos-1)*SinC; *CosB=-tmpCos1; *SinB=-tmpSin1; *CosD=-tmpCos2; *SinD=-tmpSin2; NearBall=true; } else { if((Radian1+Radian2)*(Radian1+Radian2)<Width*Width+Height*Height-300) { NearBall=false; } } }

質問者が選んだベストアンサー

  • ベストアンサー
  • simakun
  • ベストアンサー率100% (1/1)
回答No.1

>double Cos=Width/sqrt((double)(Height+Width)*(Height+Width)); >double Sin=Height/sqrt((double)(Height+Width)*(Height+Width)); Cos がコサインで Sin がサインのつもりなら上の式が おかしいと気付く筈 それ以外は、仮引数の意味(何を表しているのか)が不明 なので(私には)答えられない (例:Radian1, Radian2, Vec1, Vec2, SinB, CosB, SinD, CosD) 玉が衝突するのなら、玉の大きさは考えなくていいのだろうか >if((Radian1+Radian2)*(Radian1+Radian2)>=Width*Width+Height*Height &&NearBall==false) ここで何と何とを比べているのまったく不明 仮に Radian1,2 が角度だとすると角度と長さと比べるのにどういう意味があるのだろうか

thulala
質問者

補足

回答ありがとうございます。 Cos がコサインで Sin がサインのつもりなら上の式が おかしいと気付く筈 >>気がつきました。すみません。 >>大分動きがスムーズになりました。 Radian1=ボール1の半径 Radian2=ボール2の半径 Vec1=今現在は不要 Vec2=今現在は不要(最初、x軸y軸の正負でひっくり返そうと思っていましたが、cos,sinでよくなりました。) SinB=ボール1のsin CosB=ボール1のcos SinD=ボール2のsin CosD=ボール2のcos if判定で, ボールの半径1とボールの半径2の和を2乗したものを ボールの中心同士の距離を2乗したものと比べました。 遅いボールに速いボールが後ろから追跡するときに 接触時に引っ張っているような感じです。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • shige_70
  • ベストアンサー率17% (168/946)
回答No.3

ずいぶんとややこしいことをしてらっしゃいますね。 まず距離の2乗を算出し(距離自体を算出するのは無駄です)、それが両方のボールの半径の和の2乗以下になったら衝突とする。 跳ね返りも、たとえば、両方のボールの中心点を結ぶ直線がy軸と平行になるように速度ベクトルを線型変換(回転)してからy成分を交換して、最後に逆変換(回転をもとに戻す)をしてあげる、という感じでいいと思います。

thulala
質問者

補足

わかりました、ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

>くっついたまま離れない。 衝突判定時に球がめりこんでいるのでは? めりこんだ球を跳ね返しても、めりこんだまま 永遠と衝突判定を繰り返すことになります。

thulala
質問者

補足

わかりました。ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ボールの衝突

    2個のボールがあり、 一個のボールの進行方向とx軸との角度をA 2個のボール同士の中心点を結んだ直線と x軸との角度をBとしたとき、 ボールが衝突した後の進行角度は2*B-A -cos(2*B-A)=(2*(cosB^2)-1)*cosA+2*sinB*CosB*sinA -sin(2*B-A)=2*sinB*cosB*cosA-(2*(cosB^2)-1)*sinA であってますでしょうか?

  • 三角比

    三角形ABCにおいて、sinA:sinB:sinC=3:5:7とするとき、比cosA:cosB:cosCを求めよ。 教えて下さい。

  • 公式。

    tanA+tanB+tanC=tanAtanBtanC sinA+sinB+sinC=4cosA/2cosB/2cosC/2 cos A + cos B+ cos C= 4 sin(A/2) sin(B/2) sin(C/2) + 1 上記の公式の証明が載ってる参考書、もしくは問題集があったら、教えてください。

  • 数学IIの三角関数の和と積の問題について

    青チャートの問題で sinA+sinB+sinC=4cosA/2cosB/2cosB/2 を証明せよ という問題で sinA+sinB+sinC が 2sin(A+B)/2・cos(A+B)/2+sin・2(A+B)  になるまでは分かったのですが、これがどうして 2sin(A+B){cos(A-B)/2+cos(A+B)/2} に変形されるのかが分かりません。教えてください。

  • 和積の公式を用いた不等式の証明

    入試で頻出ではないと思うのですが 青チャート完璧にしたほうがいいとおもって この問題ききにきましたー。 三角形ABCにおいてsinA+sinB+sinC= 4cosA/2・cosB/2・cosC/2 を証明しなさい A+B+C=π なのでC=π-(A+B) cosC/2=cos(π/2 - (A+B)/2)=sin(A+B) である ゆえに2sin(A+B)/2・cos(A-B)+sin2・(A+B)/2 =2sin(A+B)/2(cos(A-B)/2 + cos(A+B)/2) =2cosC/2・2cosA/2・cos(-B/2) =4cosA/2・cosB/2・cosC/2 というのが回答 最後の下から三番目の式以降がわかりません。 どういった変形をしているのか。 アドバイスまってます。

  • 数学・sinθ・cosθについてです

    cosA:cosB:cosC=sinA:sinB:sinCの時、三角形ABCはどのような形といえるのでしょうか。自分では分からなかったので、ご存知の方、ご教授いただけるとありがたいです…

  • △ABCにおいて、a/5=b/4=c/=6のとき、

    △ABCにおいて、a/5=b/4=c/=6のとき、次の比を最も簡単な整数で表せ。 (1)sinA:sinB:sinC (2)cosA:cosB:cosC わかりやすく説明あると嬉しいです!

  • 加法定理です

    センターの過去問で sinA + sinB = 2Sin(a+b/2)Cos(a-b/2) が与えてあるのですが、これはどういう変形をしたのでしょうか? sin(a+b/2) = sinA/2cosB/2 + cosA/2sinB/2 ......1 sin(a-b/2) = sinA/2cosB/2 - cosA/2sinB/2 ......2 1+2より sin(a+b/2)+sin(a-b/2) = 2sinA/2cosB/2 .........? でるような出ないような・・・

  • 図形の計量の証明。

    問題)3角形ABCにおいて,cosA+cosB+cosC=(???)sinA/2sinB/2sinC/2+(???)が成り立つ。(???)の中を求めよ。 ※A+B+C=180°ということをつかって,A=180°-B-Cとかやるのかもしれないのですが,それをどのように利用してよいのか全くわかりません。 よろしくお願いします。

  • △ABCの内角をABCとするとき,以下を説明せよ。

    △ABCの内角をABCとするとき,以下を説明せよ。 (1)sinA+sinB+sinC=4cos(A/2)cos(B/2)cos(C/2) (2)sin(2A)+sin(2B)+sin(2C)=4sinAsinBsinC (3)tanA+tanB+tanC=tanAtanBtanC (1)ですが,  sinA+sinB+sinC =sinA+sinB+sin(π-(A+B)) =sinA+sinB+sin(A+B) =sinA+sinB+sinAcosB+cosAsinB =sinA(1+cosB)+sinB(1+cosA) =4sin(A/2)cos(A/2)cos^2(B/2)+4sin(B/2)cos(B/2)cos^2(A/2) =4cos(A/2)cos(B/2)(sin(A/2)cos(B/2)+cos(A/2)sin(B/2)) =4cos(A/2)cos(B/2)sin((A+B)/2) =4cos(A/2)cos(B/2)cos(C/2). のようなことを調べたのですが, sinA+sinB+sin(π-(A+B)) =sinA+sinB+sin(A+B) のところがどうしてそうなるのか分かりません。教えてください。