1733: 计算圆的周长
时间限制: 1 Sec 内存限制: 32 MB提交: 5 解决: 5
您该题的状态:已完成
[提交][状态][讨论版]
题目描述
如果告诉你圆的直径,那么计算圆的周长是非常简单的。但是,这次不告诉你圆的直径。
现给你圆周上三个点的坐标,请你计算圆的周长。
现给你圆周上三个点的坐标,请你计算圆的周长。
输入
输入包含多组测试数据。每组输入包含6个实数x1,y1,x2,y2,x3,y3,表示圆周上三个点的坐标。
圆的直径不会超过1000000。
圆的直径不会超过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
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;
}