The Circumference of the Circle
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 8310 | Accepted: 4960 |
Description
To calculate the circumference of a circle seems to be an easy task - provided you know its diameter. But what if you don‘t?
You are given the cartesian coordinates of three non-collinear points in the plane.
Your job is to calculate the circumference of the unique circle that intersects all three points.
Input
The
input will contain one or more test cases. Each test case consists of
one line containing six real numbers x1,y1, x2,y2,x3,y3, representing
the coordinates of the three points. The diameter of the circle
determined by the three points will never exceed a million. Input is
terminated by end of file.
Output
For
each test case, print one line containing one real number telling the
circumference of the circle determined by the three points. The
circumference is to be printed accurately rounded to two decimals. The
value of pi is approximately 3.141592653589793.
Sample Input
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
Sample Output
3.14 4.44 6.28 31.42 62.83 632.24 3141592.65 开始准备用二分去找的...然后忘了外接圆的定义,然后百度,,发现直接有公式这里是外接圆半径公式
外接圆:
下面是公式推导:
∴
由海伦公式得
∴
内切圆:
∵
∴
由海伦公式可知,
∴
解得
#include<stdio.h> #include<iostream> #include<string.h> #include <stdlib.h> #include<math.h> #include<algorithm> using namespace std; const double pi = 3.141592653589793; const double esp = 1e-8; struct Point{ double x,y; }p[3]; double dis(Point a,Point b){ return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); } int main() { while(scanf("%lf%lf%lf%lf%lf%lf",&p[0].x,&p[0].y,&p[1].x,&p[1].y,&p[2].x,&p[2].y)!=EOF){ double a = sqrt(dis(p[0],p[1])); double b = sqrt(dis(p[1],p[2])); double c = sqrt(dis(p[0],p[2])); double r = a*b*c/sqrt((a+b+c)*(-a+b+c)*(a-b+c)*(a+b-c)); printf("%.2lf\n",2*pi*r); } return 0; }