円と円の当たり判定 PART2
円と円の当たり判定 PART2
2つの円の当たり判定をしようと思います。
cx1とcx2は2つの円の中心のx座標
cy1とcy2は2つの円の中心のy座標
cz1とcz2は2つの円の半径
pow(cx1-cx2,2.0)+pow(cy1-cy2,2.0)>=pow(cz1+cz2,2.0)
のときに当たりというような感じで正しく判定されるでしょうか?
cx1とcx2は2つの円の中心のx座標
cy1とcy2は2つの円の中心のy座標
cz1とcz2は2つの円の半径
pow(cx1-cx2,2.0)+pow(cy1-cy2,2.0)>=pow(cz1+cz2,2.0)
のときに当たりというような感じで正しく判定されるでしょうか?
Re:円と円の当たり判定 PART2
質問とは関係ないですが2乗の計算であればpow関数を使うより普通の乗算でやったほうが速いと思いますよ
double a = cx1-cx2;
double b = cy1-cy2;
double c = cz1+cz2;
if (a*a + b*b >= c*c)
{
//当たっていない
}
else
{
//当たり
}
double a = cx1-cx2;
double b = cy1-cy2;
double c = cz1+cz2;
if (a*a + b*b >= c*c)
{
//当たっていない
}
else
{
//当たり
}
Re:円と円の当たり判定 PART2
メインループの球の描画のところに
CircleHitCircle(jiki.tx+12,jiki.ty+12,10,tmain2.x,tmain2.y,3,jiki.hp);
を入れても反応しないのはなぜでしょうか?
CircleHitCircle(jiki.tx+12,jiki.ty+12,10,tmain2.x,tmain2.y,3,jiki.hp);
を入れても反応しないのはなぜでしょうか?
Re:円と円の当たり判定 PART2
CircleHitCircleという関数は
MATH.H_SUPERさんにしか分からない関数なので、
これだけでは原因を突き止めることはできません
・ステップ実行や、適当な定数を入れて動作テストをして、
CircleHitCircleが適切な動きをしているか確かめる
・CircleHitCircleが正常ならば、渡すパラメータがずれていないか確かめる
というのがシンプルなバグを見つけるためのステップではないでしょうか
デバッグの基本は問題分割です
分割をして、怪しいところを一つ一つつぶしていけば、必ず原因にたどりつけるはずです。
上記の判定の考え方は正しいので、それ以外の部分をあたってみてください
MATH.H_SUPERさんにしか分からない関数なので、
これだけでは原因を突き止めることはできません
・ステップ実行や、適当な定数を入れて動作テストをして、
CircleHitCircleが適切な動きをしているか確かめる
・CircleHitCircleが正常ならば、渡すパラメータがずれていないか確かめる
というのがシンプルなバグを見つけるためのステップではないでしょうか
デバッグの基本は問題分割です
分割をして、怪しいところを一つ一つつぶしていけば、必ず原因にたどりつけるはずです。
上記の判定の考え方は正しいので、それ以外の部分をあたってみてください
Re:円と円の当たり判定 PART2
前の質問を見ると
jiki.hp = CircleHitCircle(jiki.tx+12,jiki.ty+12,10,tmain2.x,tmain2.y,3);
のようにやりたいのかなと思いましたが
jiki.hp = CircleHitCircle(jiki.tx+12,jiki.ty+12,10,tmain2.x,tmain2.y,3);
のようにやりたいのかなと思いましたが
Re:円と円の当たり判定 PART2
試しに、void TEST(int testx){
testx++;
}
という関数を作り、ループの場所に置いてみて、引数にttestxという変数を入れてみたのですが、0からカウントアップするはずがアップしていきません。
なぜでしょうか?
testx++;
}
という関数を作り、ループの場所に置いてみて、引数にttestxという変数を入れてみたのですが、0からカウントアップするはずがアップしていきません。
なぜでしょうか?
Re:円と円の当たり判定 PART2
これはTESTの引数が値渡しだからです
関数のなかのtestxはただのコピーです
呼び出し元のを変更したい場合はポインタ渡しや参照渡しを使う必要があります
void TEST(int* p){
(*p)++;
}
関数のなかのtestxはただのコピーです
呼び出し元のを変更したい場合はポインタ渡しや参照渡しを使う必要があります
void TEST(int* p){
(*p)++;
}
Re:円と円の当たり判定 PART2
関数の引数の値渡しと参照渡しの理解が出来ていないです。
C言語なら
int TEST(int testx){
return ++testx;
}
や
void TEST(int *testx){
(*testx)++;
}
とするかC++なら
void TEST(int &testx){
testx++;
}
としないと呼び出し元に更新された値は戻りません。
C言語なら
int TEST(int testx){
return ++testx;
}
や
void TEST(int *testx){
(*testx)++;
}
とするかC++なら
void TEST(int &testx){
testx++;
}
としないと呼び出し元に更新された値は戻りません。
Re:円と円の当たり判定 PART2
関数の引数はコピーなので、書き換えても元の変数は変わりません。

int test(void) { static int a=0; a++; return a; }とするか、
void test(int* a) { *a++; } /*呼び出すときは test(&a); のように変数に&を付ける */のようにします。

Re:円と円の当たり判定 PART2
ポインタの勉強からがんばります!!!
親切にありがとうございましたm(_ _)m
また質問があったらよろしくお願いします!
親切にありがとうございましたm(_ _)m
また質問があったらよろしくお願いします!
Re:円と円の当たり判定 PART2
薦める本があります。ゲームプログラミングのための数学・物理学です。
この本に円の当たり判定や3Dに必要な数学・物理学が載っています。
オススメです。
この本に円の当たり判定や3Dに必要な数学・物理学が載っています。
オススメです。