ページ 11

円と円の当たり判定 PART2

Posted: 2010年10月05日(火) 10:50
by MATH.H_SUPER
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)

のときに当たりというような感じで正しく判定されるでしょうか?

Re:円と円の当たり判定 PART2

Posted: 2010年10月05日(火) 11:38
by みけCAT
この条件の時は当たっていない気がしました。

Re:円と円の当たり判定 PART2

Posted: 2010年10月05日(火) 11:41
by シエル
不等号が逆です。

Re:円と円の当たり判定 PART2

Posted: 2010年10月05日(火) 12:29
by toyo
質問とは関係ないですが2乗の計算であればpow関数を使うより普通の乗算でやったほうが速いと思いますよ

double a = cx1-cx2;
double b = cy1-cy2;
double c = cz1+cz2;
if (a*a + b*b >= c*c)
{
//当たっていない
}
else
{
//当たり
}

Re:円と円の当たり判定 PART2

Posted: 2010年10月05日(火) 13:46
by MATH.H_SUPER
メインループの球の描画のところに
CircleHitCircle(jiki.tx+12,jiki.ty+12,10,tmain2.x,tmain2.y,3,jiki.hp);
を入れても反応しないのはなぜでしょうか?

Re:円と円の当たり判定 PART2

Posted: 2010年10月05日(火) 14:12
by うしお
CircleHitCircleという関数は
MATH.H_SUPERさんにしか分からない関数なので、
これだけでは原因を突き止めることはできません

・ステップ実行や、適当な定数を入れて動作テストをして、
 CircleHitCircleが適切な動きをしているか確かめる
・CircleHitCircleが正常ならば、渡すパラメータがずれていないか確かめる

というのがシンプルなバグを見つけるためのステップではないでしょうか

デバッグの基本は問題分割です
分割をして、怪しいところを一つ一つつぶしていけば、必ず原因にたどりつけるはずです。
上記の判定の考え方は正しいので、それ以外の部分をあたってみてください

Re:円と円の当たり判定 PART2

Posted: 2010年10月05日(火) 14:20
by toyo
前の質問を見ると
jiki.hp = CircleHitCircle(jiki.tx+12,jiki.ty+12,10,tmain2.x,tmain2.y,3);
のようにやりたいのかなと思いましたが

Re:円と円の当たり判定 PART2

Posted: 2010年10月05日(火) 14:35
by MATH.H_SUPER
試しに、void TEST(int testx){
testx++;
}
という関数を作り、ループの場所に置いてみて、引数にttestxという変数を入れてみたのですが、0からカウントアップするはずがアップしていきません。
なぜでしょうか?

Re:円と円の当たり判定 PART2

Posted: 2010年10月05日(火) 15:26
by うしお
これはTESTの引数が値渡しだからです
関数のなかのtestxはただのコピーです
呼び出し元のを変更したい場合はポインタ渡しや参照渡しを使う必要があります
void TEST(int* p){
(*p)++;
}

Re:円と円の当たり判定 PART2

Posted: 2010年10月05日(火) 15:28
by MATH.H_SUPER
すみません、知りませんでした。

苦しんで覚えるCで勉強してきます!!!

Re:円と円の当たり判定 PART2

Posted: 2010年10月05日(火) 15:28
by softya
関数の引数の値渡しと参照渡しの理解が出来ていないです。
C言語なら
int TEST(int testx){
return ++testx;
}

void TEST(int *testx){
(*testx)++;
}
とするかC++なら
void TEST(int &testx){
testx++;
}
としないと呼び出し元に更新された値は戻りません。

Re:円と円の当たり判定 PART2

Posted: 2010年10月05日(火) 15:29
by みけCAT
関数の引数はコピーなので、書き換えても元の変数は変わりません。
int test(void) {
    static int a=0;
    a++;
    return a;
}
とするか、
void test(int* a) {
    *a++;
}

/*呼び出すときは
test(&a);
のように変数に&を付ける
*/
のようにします。 画像

Re:円と円の当たり判定 PART2

Posted: 2010年10月05日(火) 16:16
by MATH.H_SUPER
ポインタの勉強からがんばります!!!

親切にありがとうございましたm(_ _)m

また質問があったらよろしくお願いします!

Re:円と円の当たり判定 PART2

Posted: 2010年10月06日(水) 19:43
by KEYONN_
薦める本があります。ゲームプログラミングのための数学・物理学です。
この本に円の当たり判定や3Dに必要な数学・物理学が載っています。
オススメです。