hdu 1700(圆最大内接三角形)

题目链接:hdu 1700

题意:给出以原点为圆心的圆上一个点,求以此点在从圆上找两个点求解三角形面积最大时,那两个点的坐标

分析:本题所用的三角形其实就是圆内接正三角形;

证明如下:

三角形的面积由底边和高两个因素决定,不管底边所在弦有多少,
但其高只有经过圆心的为最大,
故毫无质疑必须是等腰三角形。
设等腰三角形ABC,高AH,圆心O,AO=BO=R,OH=AH-AO,设高为x,
BH=√[R^2-(x-R)^2]=√(2Rx-x^2),
∴S=x√(2Rx-x^2),
dS=√(2Rx-x^2)+(1/2)*(2Rx-x^2)^(-1/2)*(2R-2x)*x=(2Rx-x^2+Rx-x^2)/√(2Rx-x^2)=0,
2x^2-3Rx=0,
x=3R/2,根据实际问题,该驻点有极大值,
即当x=3R/2时有最大面积,而高AH=3R/2,正是正三角形,
∴当圆内接正三角形时具有最大面积。
所以只需要求解出所给点绕圆心旋转120度所得点坐标即可,不过不要忘记所给答案是有顺序的,先按y再按x

代码如下:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;
const double pi=acos(-1);
const int maxn=100005;
const int INF=0x3f3f3f;
const double eps=1e-5;
int dcmp(double x){
    if(fabs(x)0)return 1;
    return -1;
}//精度为eps的比较
struct Point{
    double x,y;
}p[maxn],a[maxn],b[maxn];
bool cmpx(Point a,Point b){
    return a.x0){
            ans=b;
            b=c;
            c=ans;
        }
        if(dcmp(b.y-c.y)==0){
        if(cmpx(b,c)!=1){
                ans=b;
                b=c;
                c=ans;
        }
        }
        printf("%.3f %.3f %.3f %.3f\n",b.x,b.y,c.x,c.y);
    }
    return 0;
}


你可能感兴趣的:(North--计算几何,北门的智慧——计算几何)