zoukankan      html  css  js  c++  java
  • codeforces1c给出三点求面积

    题意:有一个正n边形的斗兽场,现存有3根柱子,柱子位于正n边形的任意3个节点上。求出正n边形的最小面积。

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <stdlib.h>
     4 #include <math.h>//采用三角函数大部分使用弧度
     5 #include <utility>
     6 #include <algorithm>
     7 using namespace std;
     8 const double eps=1e-5;
     9 const double pi=acos(-1.0);
    10 pair<double,double> p1;
    11 pair<double,double> p2;
    12 pair<double,double> p3;
    13 /*
    14  三角形外接圆半径:r=abc/4*s;
    15  面积:s=(a*b*sinC)/2=abc/4r;sinC=c/2r;
    16  最小k边形边数=2*pi/gcd(2A,gcd(2B,2C)),gcd(2A,gcd(2B,2C))表示能够符合正n边形的最大角度
    17  园周角=园心角的一半  A,B,C为三角形对应得园周角
    18  正n边形面积:n(r^2/2*sin(最大角度))
    19 */
    20 double area(double a,double b,double c)
    21 {
    22     double p=(a+b+c)/2;
    23     return sqrt(p*(p-a)*(p-b)*(p-c));
    24 }
    25 double length(pair<double,double> &a,pair<double,double> &b)
    26 {
    27     return sqrt((a.first-b.first)*(a.first-b.first)+(a.second-b.second)*(a.second-b.second));
    28 }
    29 double gcd(double a,double b)
    30 {
    31     while(fabs(a-b)>eps&&a>0&&b>0)
    32     {
    33         if(a-b>eps)
    34         {
    35             a-=b;
    36         }
    37         else if(b-a>eps)
    38         {
    39             b-=a;
    40         }
    41     }
    42     return a;
    43 }
    44 int main()
    45 {
    46     double s,a,r,n,angelp1,angelp2,angelp3,len1,len2,len3;
    47     while(scanf("%lf%lf%lf%lf%lf%lf",&p1.first,&p1.second,&p2.first,&p2.second,&p3.first,&p3.second)!=EOF)
    48     {
    49         len1=length(p1,p2);
    50         len2=length(p1,p3);
    51         len3=length(p2,p3);
    52         a=(len1+len2+len3)/2;
    53         s=sqrt(a*(a-len1)*(a-len2)*(a-len3));
    54         r=len1*len2*len3/(4*s);
    55         angelp1=(len1*len1+len2*len2-len3*len3)/(2*len1*len2);
    56         angelp2=(len1*len1+len3*len3-len2*len2)/(2*len1*len3);
    57         angelp3=(len2*len2+len3*len3-len1*len1)/(2*len2*len3);
    58         n=pi/gcd(acos(angelp1),gcd(acos(angelp2),acos(angelp3)));
    59         double ans=n/2*r*r*sin(2*pi/n);
    60         printf("%lf
    ",ans);
    61     }
    62     return 0;
    63 }
    View Code
  • 相关阅读:
    Oracle查看正在执行的存储过程的sid---转
    使用WITH子句重用子查询
    oracle解决显示数据的层次问题--实现数据缩进
    oracle9i、10g、11g区别 --转
    oracle10g安装在裸设备上
    在Linux系统上面创建使用裸设备的数据库
    监控Oracle数据库的常用shell脚本-转
    sql server使用维护计划定时备份完整数据库、差异数据库
    使用Advanced Installer14.3 简单打包windows窗体应用程序
    SVG Path标签 A 参数
  • 原文地址:https://www.cnblogs.com/linxhsy/p/4598800.html
Copyright © 2011-2022 走看看