zoukankan      html  css  js  c++  java
  • CF_1C中关于给定正多边形三点坐标,求满足条件的使得面积最小的正多边形。

     1 #include <stdio.h>
     2 #include <math.h>
     3 #define pi 3.14159265354
     4 #define esp 1e-4
     5 double gcd(double,double);
     6 double edge(double,double,double,double);
     7 int main(void)
     8 {
     9     double x1,y1,x2,y2,x3,y3;
    10     double r,A,B,C,a,b,c,area;
    11     double  n;
    12     scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3);
    13     a=edge(x1,y1,x2,y2);
    14     b=edge(x1,y1,x3,y3);
    15     c=edge(x2,y2,x3,y3);
    16     A=acos((b*b+c*c-a*a)/(2*b*c));
    17     B=acos((a*a+c*c-b*b)/(2*a*c));
    18     C=acos((a*a+b*b-c*c)/(2*a*b));
    19     double d=gcd(A,B);
    20     d=gcd(d,C);
    21     n=pi/d;
    22     area=fabs(x2*y3+x3*y1+x1*y2-x3*y2-x1*y3-x2*y1)/2;
    23     r=a*b*c/4/area;
    24     printf("%.8f\n",(n*r*r/2)*sin(2*pi/n));
    25     return 0;
    26 }double edge(double x1,double y1,double x2,double y2)
    27 {
    28     return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
    29 }
    30 double gcd(double x,double y)//这里是一中求浮点型数据的最大公约数的一种方法,比较巧妙,值得学习。
    31 {
    32     while(fabs(x)>esp&&fabs(y)>esp)
    33     {
    34         if(x>y)
    35             x-=floor(x/y)*y;
    36         else
    37           y-=floor(y/x)*x;
    38     }
    39     return x+y;
    40 }

    通过过,r=a*b*c/(4*s)求出外接圆的面积,然后通过A=acos((b*b+c*c-a*a)/(2*b*c))求出三角形三个顶角,然后利用求gcd函数求出A,B,C最大公约数,由于三角形每条边所对应的圆周角都是正多边形圆周角的整数倍,故n=pi/gcd(A,B,C),然后正多边形的面积便是n个相同的三角形的面积了,其中每个三角形面积为r*r/2*sin(2*pi/n),正多边形面积即可求出。

  • 相关阅读:
    mysql 复制表数据,表结构的3种方法
    MySQL 存储过程使用表名做参数
    关于mysql engine(引擎)的疑问
    mysql存储过程之循环
    mysql 命令大全
    关于mysql的表名/字段名/字段值是否区分大小写的问题
    navicat for mysql 快捷键(原创)
    解决"Subquery returns more than 1 row"sql查询错误
    mysql:“Access denied for user 'root@IP地址'"
    MySQL常用经典语句
  • 原文地址:https://www.cnblogs.com/rootial/p/3078104.html
Copyright © 2011-2022 走看看