中心座標が(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は使いません。詳しくはソースコード参照。
#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; }
円周が触れ合ったときはどうするのでしょうか?