![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_10.png?8acaa2e)
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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- その他(プログラミング・Web制作) Pythonにおける物理のシミュレーションでの単位変換について 2 2023/06/02 17:11
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- その他(プログラミング・Web制作) Pythonによる物理の斜方投射の位置座標表示について 2 2023/06/05 12:46
- その他(プログラミング・Web制作) ボールの動きがスムーズに動いてかつ目盛り線描画を維持するためには 4 2023/05/31 10:01
- C言語・C++・C# C言語のマクローリン展開ローラン展開のコードについて 3 2022/12/15 14:45
- その他(プログラミング・Web制作) Pythonでのかんたんな物理シミュレーションについての書籍 5 2023/06/02 07:37
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C 開放してるのにエラー(doubl...
-
関数におけるif文とreturn文に...
-
プログラムでの数字につく”f”の...
-
2次方程式の解を求めるプログ...
-
doubleの変数にintとintの割り...
-
C言語を実行すると-infが出てき...
-
C言語の型による処理速度の違い
-
c言語で、繰り返し文の中で、0....
-
C言語で台形公式を使った二重積...
-
c言語のプログラミングについて...
-
int とdoubleの比較
-
C言語で-23乗を取り扱うには
-
バイナリから実数を取得したい...
-
C言語で表記についの質問です
-
C言語の複素数についてです。
-
c言語のコンパイルエラー canno...
-
C言語(プログラミング)関連の質...
-
float型とdouble型の変数の違い...
-
大きな数の剰余
-
C言語でポインタを用いた平均,...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
doubleの変数にintとintの割り...
-
float型とdouble型の変数の違い...
-
c言語で、繰り返し文の中で、0....
-
C言語を実行すると-infが出てき...
-
C言語 関数プロトタイプ宣言の...
-
C 開放してるのにエラー(doubl...
-
C言語の型による処理速度の違い
-
至急です! マクロ定義で #defi...
-
関数におけるif文とreturn文に...
-
c言語のプログラミングについて...
-
2分法で方程式の複数の解を自...
-
-1.#IND00と出てしまうのですが...
-
doubleは常に%lfとするべきなのか
-
C言語のpow関数の不具合
-
C言語で-23乗を取り扱うには
-
C言語で台形公式を使った二重積...
-
2次方程式の解を求めるプログ...
-
Cで3乗根を求める方法
-
sin(x)の近似について
おすすめ情報