Nowadays all circuses in Berland have a round arena with diameter 13 meters, but in the past things were different.c++
In Ancient Berland arenas in circuses were shaped as a regular (equiangular) polygon, the size and the number of angles could vary from one circus to another. In each corner of the arena there was a special pillar, and the rope strung between the pillars marked the arena edges.git
Recently the scientists from Berland have discovered the remains of the ancient circus arena. They found only three pillars, the others were destroyed by the time.ui
You are given the coordinates of these three pillars. Find out what is the smallest area that the arena could have.spa
Inputcode
The input file consists of three lines, each of them contains a pair of numbers –– coordinates of the pillar. Any coordinate doesn't exceed 1000 by absolute value, and is given with at most six digits after decimal point.blog
Outputthree
Output the smallest possible area of the ancient arena. This number should be accurate to at least 6 digits after the decimal point. It's guaranteed that the number of angles in the optimal polygon is not larger than 100.ci
Examplesrem
0.000000 0.000000
1.000000 1.000000
0.000000 1.000000
1.00000000
题意:有一个正多边形,如今咱们只知道其中3个点的坐标,求原多边形的面积,若是有多个知足,求最小面积。input
思路:已知三点,咱们能够肯定外接圆,而后显然,咱们须要多边形的边长最大(或者对于的圆心角最大),可是因为有钝角或者锐角,求最大边长可能要讨论。因此咱们求最大圆心角。
可能推论:最大圆心角=三角形的三条边对应的圆心角的gcd。而后就获得了有2pi/gcd边。blabla。
(获得三个角的时候,第三个角=2pi-A-B。而直接求会WA。。。
#include<bits/stdc++.h> using namespace std; const double eps=1e-4; const double pi=acos(-1.0); double Gcd(double a,double b) { while(fabs(a)>eps&&fabs(b)>eps){ if(a>b) a-=floor(a/b)*b; else b-=floor(b/a)*a; } return a+b; } double x[4],y[4],L1,L2,L3,S,R; double dist(int a,int b){ return sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b])); } double area(){ double p=(L1+L2+L3)/2.0; return sqrt(p*(p-L1)*(p-L2)*(p-L3)); } int main() { for(int i=1;i<=3;i++) scanf("%lf%lf",&x[i],&y[i]); L1=dist(1,2); L2=dist(1,3); L3=dist(2,3); S=area(); R=L1*L2*L3/(S*4); double A=acos((R*R+R*R-L3*L3)/(2*R*R)); double B=acos((R*R+R*R-L2*L2)/(2*R*R)); double C=2*pi-A-B; double ang=Gcd(Gcd(A,B),C); double ans=pi/ang*R*R*sin(ang); printf("%.6lf\n",ans); return 0; }