トピックリンク: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 ; } / * * * /