如果告诉你圆的直径,那么计算圆的周长是非常简单的。但是,这次不告诉你圆的直径。 现给你圆周上三个点的坐标,请你计算圆的周长。
输入包含多组测试数据。每组输入包含6个实数x1,y1,x2,y2,x3,y3,表示圆周上三个点的坐标。 圆的直径不会超过1000000。
对于每组输入,输出圆的周长,结果保留2位小数。(pi的取值为3.141592653589793)
这题网上好像推出了公式 C=a* b* c *pi / 2 / S 我用模板暴力法做的,求圆心,再求半径和周长
#include<cstdio> #include<cmath> using namespace std; //基本几何结构 double eps=1e-3;//精度 struct point{ double x,y; point(double a=0,double b=0) {x=a; y=b;} }; struct line{ //a*x+b*y+c=0 double a,b,c; line(double d1=1,double d2=-1,double d3=0) {a=d1;b=d2;c=d3;} }; double distance(point p1,point p2){ return (sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y))); } line makeline(point p1,point p2){ line L;//确定的直线 int sign =1; L.a=p2.y-p1.y; if(L.a<0){ sign=-1; L.a=sign*L.a; } L.b=sign*(p1.x-p2.x); L.c=sign*(p1.y*p2.x-p1.x*p2.y); return L; } line vertical_bisector(point p1,point p2){//垂直平分线 line L; if(fabs(p1.y-p2.y)<eps){ L.a=1;L.b=0;L.c=-(p1.x+p2.x)/2; return L; } else if(fabs(p1.x-p2.x)<eps){ L.a=0;L.b=1;L.c=-(p1.y+p2.y)/2; return L; } else{ double k=(p2.y-p1.y)/(p2.x-p1.x); L.a=1;L.b=k;L.c=-(p2.y*p2.y-p1.y*p1.y+p2.x*p2.x-p1.x*p1.x)/(2*(p2.x-p1.x)); return L; } } bool lineintersect(line l1,line l2,point &p){//判两直线相交,相交返回交点p double d=l1.a*l2.b-l2.a*l1.b; if(fabs(d)<eps) return false; p.x=(l2.c*l1.b-l1.c*l2.b)/d; p.y=(l2.a*l1.c-l1.a*l2.c)/d; return true; } #define PI acos(-1) int main() { point p1,p2,p3; while(~scanf("%lf%lf%lf%lf%lf%lf",&p1.x,&p1.y,&p2.x,&p2.y,&p3.x,&p3.y)){ line l1,l2; l1=vertical_bisector(p1,p2); l2=vertical_bisector(p1,p3); point p; bool ans=lineintersect(l1,l2,p); if((fabs(p1.x-p2.x)<eps && fabs(p1.y-p2.y)<eps) || (fabs(p1.x-p3.x)<eps && fabs(p1.y-p3.y)<eps)|| (fabs(p3.x-p2.x)<eps && fabs(p3.y-p2.y)<eps))printf("nan\n"); else if(ans==0) printf("inf\n"); else printf("%.2f\n",2*PI*distance(p,p1)); } return 0; }