CF1C

CF最後の質問は、実際に計算幾何学の最初のゲームです。
テストサイトのこの質問はそれほど問題への解決策を書き込むために、より多くのです。

  • フロントチーズ

    1. 座標系の矩形平面は、距離の式を指し\(L = \ SQRT {(X_1、X_2)^ 2 +(Y_1-Y_2)^ 2} \)
    2. ヘロンの公式:算出するための三辺を知ります三角形領域\(S = \ SQRT {P(PA)、鉛(Pb)(PC)} \) ここで\(A、B、C \ ) 三角形の辺の、\(P = \ FRAC {A + B + C {2}} \)
    3. 外接円半径の式\(= R&LT \ 4S FRAC {ABC} {} \)
    4.ソリューション三角形
    (角を知る三角シーク):
    \(\ COS B = \ A {FRAC ^ 2 + C ^ 2-B ^ 2} {2AC} \)
    \(\ COS A = \ FRAC {B ^ 2 + C ^ 2-A ^ 2} {2BC} \)
    \(\ COS C = \ FRAC {^ 2 + B ^ 2
    -C ^ 2} {2AB} \) 次に、\(\ A COS、\ COS C \ COS B、\) に\(\ ARCCOS()\)決定された角度
    知ら( )第3辺の両側に角度を求め
    (C = \ SQRT \ {2 + A ^ B ^ 2-2ab \ COS C} \)
    5. ユークリッドアルゴリズム(GCD):この質問は何も見えません、特に、それは後述します。
  • 具体的に

    :図を見て
    ここに画像を挿入説明
    図の後部Aは、B、Cが与えられた点で、同じことが正多角形は三角形、円の中心O、AO = BO = COの円を外接、外接円半径式を知っていることがわかります溶液中に三角形を描画される、AO、BO、COを得ることができる\(\角AOB \) \(\角BOC \) および\(\角度AOC \) より図を大きくを参照^ 180(\ \ CIRC \)角度)は、3本の角と3つの角度の間の関係の特定の数は、角の整数倍として表すことができる見つけることができ、隣接する黄色角の半径は、この角度が設定されている\ (\角度\アルファ\)次に、図\(\角AOBが= 3 * \角度\アルファ\) \(\角BOC = 2 * \角度\アルファ\) \(\角度AOC = 6は* \角度\アルファ\) 次いで(\ \角度\アルファ= GCD(\角AOBを、GCD(\角BOCを、\角度AOC))を\) 各小三角形のための角度の三辺は、全てのノウハウを知っています、また、三角形の数を知って、総面積を決定することができます。
  • コード

#include<bits/stdc++.h>
using namespace std;
const double pi=3.1415926;
double mod(double a,double b)//小数取模
{
    return a-(int)(a/b)*b;
}
double gcd(double x,double y)//小数gcd
{
    if(y<=0.0001)return x;
    return gcd(y,mod(x,y));
}
double x,y,x2,y2,x3,y3;
int main()
{
    scanf("%lf%lf%lf%lf%lf%lf",&x,&y,&x2,&y2,&x3,&y3);
    //计算三角形三条边长
    double a=sqrt((x-x2)*(x-x2)+(y-y2)*(y-y2));
    double b=sqrt((x-x3)*(x-x3)+(y-y3)*(y-y3));
    double c=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
    double p=(a+b+c)/2;
    double r=(a*b*c)/(4*sqrt(p*(p-a)*(p-b)*(p-c)));//通过r=(abc)/(4s)得出外接圆半径
    //分别求出以三条边为低,外接圆半径为腰的三角形的顶角角度
    double angle1=acos(1-(a*a)/(2*r*r));
    double angle2=acos(1-(b*b)/(2*r*r));
    double angle3=2*pi-angle1-angle2;
    double angle=gcd(angle1,gcd(angle2,angle3))/pi*180;//题目所示的以正多边形边长为低接圆半径为腰的三角形的顶角角度
    double side=sqrt(2*r*r-2*r*r*cos(angle/180*pi));//求出正多边形的边长
    double P=(r*2+side)/2;
    double S=sqrt(P*(P-r)*(P-r)*(P-side))/*三角形面积*/*(360/angle)/*三角形个数*/;//计算面积
    printf("%.6lf",S);//保留6位小数输出
    return 0;
}

おすすめ

転載: www.cnblogs.com/Sxy_Limit/p/12164957.html