计算圆的周长
-
描述
-
如果告诉你圆的直径,那么计算圆的周长是非常简单的。但是,这次不告诉你圆的直径。
现给你圆周上三个点的坐标,请你计算圆的周长。-
输入
-
输入包含多组测试数据。每组输入包含6个实数x1,y1,x2,y2,x3,y3,表示圆周上三个点的坐标。
圆的直径不会超过1000000。
输出
- 对于每组输入,输出圆的周长,结果保留2位小数。(pi的取值为3.141592653589793) 样例输入
-
0.0 -0.5 0.5 0.0 0.0 0.5
样例输出
-
3.14
-
输入包含多组测试数据。每组输入包含6个实数x1,y1,x2,y2,x3,y3,表示圆周上三个点的坐标。
思路:
double area(double x0,double y0,double x1,double y1,double x2,double y2)
{
return fabs(x0*y1+x2*y0+x1*y2-x2*y1-x0*y2-x1*y0)/2;
}
它给出了三角形(x0,y0)-(x1,y1)-(x2,y2)的有向面积的两倍,如果三角形ABC的三个顶点呈逆时针排列,那么有向面积为正,如果是顺时针排列,则有向面积为负。
可以记它的行列式形式:
|x0 y0 1 |
2s=|x1 y1 1 |=(x0*y1+x2*y0+x1*y2-x2*y1-x0*y2-x1*y0)
|x2 y2 1 |
由正弦定理,R为三角形外接圆的半径
因为周长C=2*pi*R=a/sinA
而S=b*c*sinA/2
化简得
C=a*b*c*pi/s/2;
#include<stdio.h>
#include<math.h>
#define pi 3.141592653589793
double area(double x0,double y0,double x1,double y1,double x2,double y2)
{
return fabs(x0*y1+x2*y0+x1*y2-x2*y1-x0*y2-x1*y0)/2;
}
int main()
{
double a,b,c,x0,x1,x2,y0,y1,y2,C,s;
while(scanf("%lf%lf%lf%lf%lf%lf",&x0,&y0,&x1,&y1,&x2,&y2)!=EOF)
{
a=sqrt((x2-x0)*(x2-x0)+(y2-y0)*(y2-y0));
b=sqrt((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0));
c=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
s=area(x0,y0,x1,y1,x2,y2);
C=pi*a*b*c/s/2;
printf("%.2lf\n",C);
}
return 0;
}