poj1329,三角形求外接圆。 貌似没有0的问题。 由于自己的不小心,差点被此题搞死,还好ac了。 #include <iostream> #include <cmath> using namespace std; const double eps=1e-10; struct point { double x,y; }p[3]; struct line { //点斜式存直线 bool f;//是否存在斜率 double k,x,y; }l[4];//前两条是三角形直线,后两条是他们的中垂线 int main() { double x,y,r,d,e,f; while (cin >> p[0].x >> p[0].y >> p[1].x >> p[1].y >> p[2].x >> p[2].y) { if (fabs(p[0].x-p[1].x)<eps) l[0].f=false; else { l[0].f=true; l[0].k=(p[0].y-p[1].y)/(p[0].x-p[1].x); } if (fabs(p[0].x-p[2].x)<eps) l[1].f=false; else { l[1].f=true; l[1].k=(p[0].y-p[2].y)/(p[0].x-p[2].x); } //中垂线 l[2].x=(p[0].x+p[1].x)/2; l[2].y=(p[0].y+p[1].y)/2; if (fabs(l[0].k)<eps) l[2].f=false; else { l[2].f=true; if (l[0].f==false) l[2].k=0; else l[2].k=-1/l[0].k; } l[3].x=(p[0].x+p[2].x)/2; l[3].y=(p[0].y+p[2].y)/2; if (fabs(l[1].k)<eps) l[3].f=false; else { l[3].f=true; if (l[1].f==false) l[3].k=0; else l[3].k=-1/l[1].k; } //相交 if (l[2].f==false) { x=l[2].x; y=l[3].k*(x-l[3].x)+l[3].y; } else if (l[3].f==false) { x=l[3].x; y=l[2].k*(x-l[2].x)+l[2].y; } else { x=(l[3].y-l[2].y+l[2].k*l[2].x-l[3].k*l[3].x)/(l[2].k-l[3].k); y=l[2].k*(x-l[2].x)+l[2].y; } r=pow((x-p[0].x)*(x-p[0].x)+(y-p[0].y)*(y-p[0].y),0.5); //printf("%.3lf %.3lf %.3lf/n",x,y,r); if (fabs(x)<eps) printf("x^2"); else if (x>eps) printf("(x - %.3lf)^2",x); else printf("(x + %.3lf)^2",-x); printf(" + "); if (fabs(y)<eps) printf("y^2"); else if (y>eps) printf("(y - %.3lf)^2",y); else printf("(y + %.3lf)^2",-y); printf(" = %.3lf^2/n",r); d=-x*2; e=-y*2; f=x*x+y*y-r*r; printf("x^2 + y^2"); if (d<0) printf(" - %.3lfx",-d); else printf(" + %.3lfx",d); if (e<0) printf(" - %.3lfy",-e); else printf(" + %.3lfy",e); if (f<0) printf(" - %.3lf",-f); else printf(" + %.3lf",f); printf(" = 0/n/n"); } //system("pause"); return 0; }