B - 二つのサークル交差点CodeForcesのエリア - 600D

トピックリンク:https://codeforces.com/problemset/problem/600/D

次の2つの円が与えられています。その交差点のエリアを検索します。

入力

最初の行は三つの整数含ま  X 1、  Y 1、  R 1  ( - 10 9  ≤  X 1、  Y 1  ≤10 9、1つの≤  R 1  ≤10 9) -中心の位置と第1の円の半径。

2行目は三つの整数含ま  X 2、  Y 2、  R 2が  ( - 10 9  ≤  X 2、  Y 2  ≤10 9、1つの≤  R 2  ≤10 9) -中心の位置と第二の円の半径。

出力

円の交差部分の面積を印刷します。絶対的または相対的な誤差が超えない場合答えが正しい考える  10  6 -

入力
0 0 4 
6 0 4
出力
7.25298806364175601379
入力
0 0 5 
11 0 5
出力
0.00000000000000000000 
タイトル効果:2つの交差する円形の領域の和
思考:3例に関して説明交点から含む
コードを見て:
#include <iostreamの> 
する#include <CStringの> 
する#include <アルゴリズム> 
の#include <cstdioを> 
する#include <ベクトル> 
の#include <cmath>
 使用して 名前空間をSTD。
typedefの長い ダブルLD;
const  int型 MAXN = 1E5 + 5 const  int型 MAXM = 1E5 + 10 CONST LDパイ= ACOS( - 1 )。
int型のmain()
{
    LDのX1、Y1、R1、X2、Y2、R2;
    CIN >> X1 >> Y1 >> R1 >> X2 >> Y2 >> R2。
    LDは、D = SQRT((X1-X2)*(X1-X2)+(Y1-Y2)*(Y1- Y2))。
    もし(D> = R1 + R2)のprintf(" 0.000000000000 \ n " );
    それ以外の 場合(D <=工場(R1- R2))
    {
        printf(" %.20Lf \ n "、分(PI * R1 * R1と、PI * R2 * R2))。
    }
    
    {
        LD C =(R 2×R 2 + D * D * R 1 R 1)/(2 *、R 2 * D)。// COS 
        LD CC = ACOS(C); // 角度 
        LDのSAREA = CC * 2 /(2)*、R 2 * 、R 2、
        ンイド = R 2 *、R 2 * C * SIN(CC)。

        C1のLD =(R1 + R1 * R2 * D * D-R2)/(2 * R1 * D); // COS 
        LD CC1 = ACOS(C1); //  
        LD * sarea1 CC1 = 2 /(2)* * R1 R1。
        LD tarea1 = R1 * C1 * R1 * 罪(CC1)。
        printf(" %.20Lf \ n "、(sarea1-tarea1)+(sarea- ハード))。
    }

    リターン 0 ;
}
/ * *

* /

 

おすすめ

転載: www.cnblogs.com/caijiaming/p/11973181.html
おすすめ