POJ 1329 Circle Through Three Points
2416 ワード
3つの円の上の点をあげて、円の2つの表現を求めます.まず知識を普及させる:
外接円半径:式:a/sinA=b/sinB=c/sinC=2 R(Rは外接円半径)本題はこうすることができる:1.まず余弦定理:a^2=b^2+c^2−2−2 bc・cosAを用いて求める:cosA=(b^2+c^2−a^2)/2 bcを用いて式:sinA^2+cosA^2=1 sinA=ルート番号(1−cosA^2)=ルート番号[(a^2+b^2+c^2)^2−2(a^4+b^4+c^4+c^4)/(2)/(2(2 2 2(a^4+b^4+b^4+c^4+c^4+c^4)/(2 bc)次にa/sinA=2 Rを代入してR.R=abc/ルート番号を求める[(a^2+b^2+c^2)^2-2(a^4+b^4+c^4)]定義:平面上の3点A(x 1,y 1),B(x 2,y 2),C(x 3,y 3),定義S(A,B,C)=(x 1-x 3)*(y 2-y 3)-(y 1-y 3)*(x 2-x 3)
三角形の3つの頂点がA(x 1,y 1),B(x 2,y 2),C(x 3,y 3)であることが知られていると、この三角形の外心は、S((x 1*x 1+y 1*y 1,y 1),(x 2*x 2+y 2*y 2,y 2),(x 3*x 3+y 3*y 3*y 3,y 3))x 0=---------------------------------------------------------------------------------------------------------------------------------------------------------------------------2*S(A,B,C)S((x 1,x 1*x 1*x 1+y 1*y 1),(x 2,x 2*x 2,x 2*x 2+y 2*y 2) (x3, x3*x3+y3*y3)) y0 = ----------------------------------------------------------- 2*S(A,B,C)
円心の座標と半径を求めて出力します.
コード:
外接円半径:式:a/sinA=b/sinB=c/sinC=2 R(Rは外接円半径)本題はこうすることができる:1.まず余弦定理:a^2=b^2+c^2−2−2 bc・cosAを用いて求める:cosA=(b^2+c^2−a^2)/2 bcを用いて式:sinA^2+cosA^2=1 sinA=ルート番号(1−cosA^2)=ルート番号[(a^2+b^2+c^2)^2−2(a^4+b^4+c^4+c^4)/(2)/(2(2 2 2(a^4+b^4+b^4+c^4+c^4+c^4)/(2 bc)次にa/sinA=2 Rを代入してR.R=abc/ルート番号を求める[(a^2+b^2+c^2)^2-2(a^4+b^4+c^4)]定義:平面上の3点A(x 1,y 1),B(x 2,y 2),C(x 3,y 3),定義S(A,B,C)=(x 1-x 3)*(y 2-y 3)-(y 1-y 3)*(x 2-x 3)
三角形の3つの頂点がA(x 1,y 1),B(x 2,y 2),C(x 3,y 3)であることが知られていると、この三角形の外心は、S((x 1*x 1+y 1*y 1,y 1),(x 2*x 2+y 2*y 2,y 2),(x 3*x 3+y 3*y 3*y 3,y 3))x 0=---------------------------------------------------------------------------------------------------------------------------------------------------------------------------2*S(A,B,C)S((x 1,x 1*x 1*x 1+y 1*y 1),(x 2,x 2*x 2,x 2*x 2+y 2*y 2) (x3, x3*x3+y3*y3)) y0 = ----------------------------------------------------------- 2*S(A,B,C)
円心の座標と半径を求めて出力します.
コード:
#include<iostream>
#include<cmath>
using namespace std;
double Dist(double x,double y,double x1,double y1)
{
return (x-x1)*(x-x1)+(y-y1)*(y-y1);
}
double Sn(double x1,double y1,double x2,double y2,double x3,double y3)
{
return (x1-x3)*(y2-y3)-(y1-y3)*(x2-x3);
}
void Fn(double x)
{
if(x<0) printf(" + %.3lf",-x);
else printf(" - %.3lf",x);
}
int main()
{
double x1,x2,x3,y1,y2,y3,x,y;
while( scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3)!=EOF){
double a=Dist(x1,y1,x2,y2);
double b=Dist(x2,y2,x3,y3);
double c=Dist(x3,y3,x1,y1);
double r=sqrt(a*b*c)/sqrt((a+b+c)*(a+b+c)-2*(a*a+b*b+c*c));
// printf("%.lf
",r);
double s=Sn(x1,y1,x2,y2,x3,y3);
double s1=Sn( x1*x1+y1*y1, y1, x2*x2+y2*y2, y2, x3*x3+y3*y3, y3);
double s2=Sn( x1,x1*x1+y1*y1, x2, x2*x2+y2*y2, x3, x3*x3+y3*y3);
x=s1/(2*s);
y=s2/(2*s);
printf("(x");
Fn(x);
printf(")^2 + (y");
Fn(y);
printf(")^2 = %.3lf^2
",r);
printf("x^2 + y^2");
Fn(2*x); printf("x");
Fn(2*y); printf("y");
Fn(r*r-x*x-y*y);
printf(" = 0
");
}
return 0;
}