[Atelier Blue アトリエブルー]Homeコンテストパソコン甲子園2003年本選>27問目

27問目(円の衝突判定)

問題

中心座標が(xa,ya)で半径がraの円Aと、中心座標が(xb,yb)で半径がrbの円Bが与えられたとき、BがAの中にあるとき2、AがBの中にあるとき-2、Aの円周とBの円周が交わっているとき1、AとBが重なっていないとき0を出力するプログラムを作成。なお、AとBは同じものではないとする。

入力


xa(実数)
ya(実数)
ra(実数)
xb(実数)
yb(実数)
rb(実数)

出力

2,-2,1,0のいずれかの数値

入力例


0
0
3
0
1
2

出力例

2

解き方例

ゲームなどではよく行う衝突判定を行います。両辺2乗で判定するのでsqrtは使いません。詳しくはソースコード参照。

ソースコード

お持ち帰り

C/C++

#include <stdio.h>

int main(){
    double xa,ya,ra,xb,yb,rb;
    double r,l;


    scanf("%lf %lf %lf %lf %lf %lf",&xa,&ya,&ra,&xb,&yb,&rb);
    //円の中心同士の距離を求める(ただし二乗値)
    l = (xa -xb)*(xa -xb) + (ya -yb)*(ya - yb);

    //どちらかがもう一方の円の中に入っているか判定
    r = ra-rb;
    if(r*r >= l){
        //どちらがどちらの円に入っているのか判定
        if(r>0){
            printf("2\n");
        }else{
            printf("-2\n");
        }
    }else{
        r=ra+rb;
        //交叉判定
        if(r*r > l){
            printf("1\n");
        }else{
            printf("0\n");
        }
    }
    return 0;
}

その他

円周が触れ合ったときはどうするのでしょうか?


ページの一番上へ
前のページへ 一覧に戻る 次のページへ
初版2006--
[Atelier Blue アトリエブルー]Homeコンテストパソコン甲子園2003年本選>27問目