HHUOJ 1412 计算圆的周长

mac2026-09-29  3

HHUOJ 1412 计算圆的周长

题目描述

如果告诉你圆的直径,那么计算圆的周长是非常简单的。但是,这次不告诉你圆的直径。 现给你圆周上三个点的坐标,请你计算圆的周长。

输入

输入包含多组测试数据。每组输入包含6个实数x1,y1,x2,y2,x3,y3,表示圆周上三个点的坐标。 圆的直径不会超过1000000。

输出

对于每组输入,输出圆的周长,结果保留2位小数。(pi的取值为3.141592653589793)

样例输入

0.0 -0.5 0.5 0.0 0.0 0.5 0.0 0.0 0.0 1.0 1.0 1.0 5.0 5.0 5.0 7.0 4.0 6.0 0.0 0.0 -1.0 7.0 7.0 7.0 50.0 50.0 50.0 70.0 40.0 60.0 0.0 0.0 10.0 0.0 20.0 1.0 0.0 -500000.0 500000.0 0.0 0.0 500000.0

样例输出

3.14 4.44 6.28 31.42 62.83 632.24 3141592.65

这题网上好像推出了公式 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; }
最新回复(0)