题意:给你三个圆上的点,求圆的两种表达式。首先普及知识:
外接圆半径:公式:a/sinA=b/sinB=c/sinC=2R (R就是外接圆半径)
本题可以这样:①.先利用余弦定理:a^2=b^2+c^2-2bc·cosA
求出:cosA=(b^2+c^2-a^2)/2bc 在利用公式:sinA^2+cosA^2=1
确定 sinA=根号(1-cosA^2) =根号[(a^2+b^2+c^2)^2-2(a^4+b^4+c^4)]/(2bc)
然后代入 a/sinA=2R求出R. R=abc/根号[(a^2+b^2+c^2)^2-2(a^4+b^4+c^4)]
定义:设平面上的三点A(x1,y1),B(x2,y2),C(x3,y3),定义
S(A,B,C) = (x1-x3)*(y2-y3) - (y1-y3)*(x2-x3)
已知三角形的三个顶点为A(x1,y1),B(x2,y2),C(x3,y3),则该三角形的外心为:
S((x1*x1+y1*y1, y1), (x2*x2+y2*y2, y2), (x3*x3+y3*y3, y3))
x0 = -----------------------------------------------------------
2*S(A,B,C)
S((x1,x1*x1+y1*y1), (x2, x2*x2+y2*y2), (x3, x3*x3+y3*y3))
y0 = -----------------------------------------------------------
2*S(A,B,C)
把圆心的坐标和半径求出来之后就输出。
注意输出
#include<stdio.h>
#include<math.h>
struct POINT
{
double x,y;
}point[5];
double distance(POINT a,POINT b)
{
return sqrt( (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double area(double x1,double y1,double x2,double y2,double x3,double y3)
{
return ((x1-x3)*(y2-y3)-(y1-y3)*(x2-x3) );
}
int main()
{
double r,s,x,y,a,c,b,x1,x2,x3,y1,y2,y3,k;
while(scanf("%lf%lf%lf%lf%lf%lf",&point[1].x,&point[1].y,&point[2].x,&point[2].y,&point[3].x,&point[3].y)!=EOF)
{
a=distance(point[2],point[3]);
b=distance(point[1],point[3]);
c=distance(point[1],point[2]);
x1=point[1].x;
y1=point[1].y;
x2=point[2].x;
y2=point[2].y;
x3=point[3].x;
y3=point[3].y;
r=a*b*c/sqrt((a*a+b*b+c*c)*(a*a+b*b+c*c)-2*(a*a*a*a+b*b*b*b+c*c*c*c));
s=2*area(point[1].x,point[1].y,point[2].x,point[2].y,point[3].x,point[3].y);
x=area(x1*x1+y1*y1,y1,x2*x2+y2*y2,y2,x3*x3+y3*y3,y3)/s;
y=area(x1,x1*x1+y1*y1,x2,x2*x2+y2*y2,x3,x3*x3+y3*y3)/s;
//printf("%.3lf %.3lf %.3lf\n",x,y,r);
if(x==0)
printf("(x)^2 + ");
else if(x<0)
printf("(x + %.3lf)^2 + ",-1*x);
else
printf("(x - %.3lf)^2 + ",x);
if(y==0)
printf("(y)^2 = ");
else if(y<0)
printf("(y + %.3lf)^2 = ",-1*y);
else
printf("(y - %.3lf)^2 = ",y);
printf("%.3lf^2\n",r);
printf("x^2 + y^2 ");
if(x>0)
printf("- %.3lfx ",2*x);
else
printf("+ %.3lfx ",-2*x);
if(y>0)
printf("- %.3lfy ",2*y);
else
printf("+ %.3lfy ",-2*y);
k=x*x+y*y-r*r;
if(k<0)
printf("- %.3lf = 0\n",-k);
else
printf("+ %.3lf = 0\n",k);
printf("\n");
}
return 0;
}