

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;
}
}
}
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 が角度だとすると角度と長さと比べるのにどういう意味があるのだろうか
この回答への補足
回答ありがとうございます。
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乗したものと比べました。
遅いボールに速いボールが後ろから追跡するときに
接触時に引っ張っているような感じです。
No.3
- 回答日時:
ずいぶんとややこしいことをしてらっしゃいますね。
まず距離の2乗を算出し(距離自体を算出するのは無駄です)、それが両方のボールの半径の和の2乗以下になったら衝突とする。
跳ね返りも、たとえば、両方のボールの中心点を結ぶ直線がy軸と平行になるように速度ベクトルを線型変換(回転)してからy成分を交換して、最後に逆変換(回転をもとに戻す)をしてあげる、という感じでいいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C言語を実行すると-infが出てき...
-
至急です! マクロ定義で #defi...
-
C言語の型による処理速度の違い
-
-1.#IND00と出てしまうのですが...
-
doubleの変数にintとintの割り...
-
c言語で、繰り返し文の中で、0....
-
C言語初心者 構造体 課題について
-
浮動小数点の定数
-
2次方程式の解を求めるプログ...
-
3次方程式の求解プログラム(...
-
DWORDの警告
-
linux RedHatでC言語
-
プログラミングについての質問...
-
C言語の複素数についてです。
-
C言語でdouble型の小数点の引き...
-
doubleは常に%lfとするべきなのか
-
関数におけるif文とreturn文に...
-
long double型の戻り値を持つ関...
-
2自由度減衰振動のルンゲクッタ法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C言語を実行すると-infが出てき...
-
doubleの変数にintとintの割り...
-
float型とdouble型の変数の違い...
-
c言語で、繰り返し文の中で、0....
-
至急です! マクロ定義で #defi...
-
C 開放してるのにエラー(doubl...
-
C言語の型による処理速度の違い
-
C言語 関数プロトタイプ宣言の...
-
float と double
-
ラグランジュの補間法のCプログ...
-
C言語のプログラムで#include<m...
-
c言語のコンパイルエラー canno...
-
2分法で方程式の複数の解を自...
-
2次方程式の解を求めるプログ...
-
C言語で台形公式を使った二重積...
-
Cプログラミングの問題です。ニ...
-
物体が往復する動きを作りたい
-
関数におけるif文とreturn文に...
-
doubleは常に%lfとするべきなのか
おすすめ情報