「AOJ再挑戦問10~14」の編集履歴(バックアップ)一覧に戻る

AOJ再挑戦問10~14 - (2014/01/11 (土) 05:04:20) の1つ前との変更点

追加された行は青色になります

削除された行は赤色になります。

+*問10 Circumscribed Circle of a Triangle
+http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0010&lang=jp
+三角形の3頂点の座標が与えられるので外心の座標と半径を計算する問題。
 
+解法
+外心のベクトル表示そのまま実装で解きます。
+
+
+ #include<stdio.h>
+ #include<math.h>
+ 
+ 
+ //外心のベクトル表示から座標を求める
+ double calc_sin2(double x1,double y1,
+ 		 double x2,double y2,
+ 		 double x3,double y3){
+ 	//sin2Aを求める関数
+ 	double dx1,dy1,dx2,dy2,cosA,sinA,len1,len2;
+ 	dx1=x2-x1;
+ 	dy1=y2-y1;
+ 	dx2=x3-x1;
+ 	dy2=y3-y1;
+ 	len1=sqrt(dx1*dx1+dy1*dy1);
+ 	len2=sqrt(dx2*dx2+dy2*dy2);
+ 	cosA=(dx1*dx2+dy1*dy2)/(len1*len2);
+ 	sinA=(dx1*dy2-dy1*dx2)/(len1*len2);
+ 	return 2*cosA*sinA;	
+ } 
+ void calc_point(double x1,double y1,
+		double x2,double y2,
+ 		double x3,double y3){
+ 	//外心を求める関数
+ 	//外心のベクトル表示をそのまま実装
+  	double sin2A,sin2B,sin2C,sumSin,r;
+ 	sin2A=calc_sin2(x1,y1,x2,y2,x3,y3);
+ 	sin2B=calc_sin2(x2,y2,x3,y3,x1,y1);
+ 	sin2C=calc_sin2(x3,y3,x1,y1,x2,y2);
+ 	sumSin=sin2A+sin2B+sin2C;
+  	double ansX,ansY;
+ 	ansX=(x1*sin2A+x2*sin2B+x3*sin2C)/sumSin;
+ 	ansY=(y1*sin2A+y2*sin2B+y3*sin2C)/sumSin;
+ 	r=sqrt((x1-ansX)*(x1-ansX)+(y1-ansY)*(y1-ansY));
+ 	printf("%.3lf %.3lf %.3lf\n",ansX,ansY,r);
+ }
+ 
+ int main(){
+ 	int n;
+  	double x1,y1,x2,y2,x3,y3;
+ 	scanf("%d",&n);
+ 	while(n--){
+ 		scanf("%lf %lf %lf %lf %lf %lf",
+ 			&x1,&y1,&x2,&y2,&x3,&y3);
+ 		calc_point(x1,y1,x2,y2,x3,y3);
+ 	}
+ }