トピックへのリンク:https://vjudge.net/problem/POJ-1584
ポリゴンが凸包であるかどうかを尋ねることは凸包であり、その後、Q円は凸包内、中心を決定する最初の凸包決定半径と中心から端までの距離内である(等しい面積法を用い、これは外積です)関係。
3つのテンプレートを一緒に入れて。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 / * *********************************************** ************************* 2 >ファイル名:poj1584.cpp 3 #ファイル名:poj1584.cpp 4 #著者:xiaobuxie 5 #QQ: 760427180 6 #Eメール:[email protected] 7 #作成日時:2019年09月21日星期六20时28分44秒 8 ********************* ************************************************** * / 9 10の#include <iostreamの> 11の#include <cstdioを> 12の#include <地図> 13の#include <cmath> 14の#include <CStringの> 15の#include <セット > 16の#include <キュー> 17の#include <ベクトル> 18の#include <アルゴリズム> 19 使用 名前空間STDを、 20 typedefの長い 長いLL。 21 の#define INF 0x3f3f3f3f 22 の#define PQ PRIORITY_QUEUE <> int型、ベクトル<整数>、大きな<整数> 23 LLのGCD(-1,11,11- b)は{ 24 であれば(<B)戻りGCD(B、A)。 25 リターン Bの== 0:GCD(B、%の?B)。 26 } 27 28 29 の#definePI 3.141592654 30 の#define EPS 1E-6 31 のconst int型 N = 1010 。 32 INT N。 33 int型 SGN(ダブルX){ 34 であれば(ファブ(X)<EPS)戻り 0 ; 35 であれば(X < 0)リターン - 1 。 36 リターン 1 。 37 } 38 構造体のポイント{ 39 ダブルX、Y。 40 ポイント演算子 - (CONSTポイント&B)のconst { 41 リターン(ポイント){xb.x、Y- によって}。 42 } 43 ダブル 演算子 *(constのポイント&B)のconst { 44 リターン X * b.x + yは* によって。 45 } 46 ダブル 演算子 ^(CONSTポイント&B)のconst { 47 リターン X *で-BX *のY。 48 } 49 } P [N]。 50 二重DIST(A点、B点){ 51 リターンSQRT((BX-AX)*(BX-AX)+(バイAY)*(副)AY)。 52 } 53 二重角度(点O、点A、点B){ 54の リターン ACOS(((AO)*(BO))/(DIST(O、A)* DIST(O、B)))。 55 } 56 // 判断是否凸包 57 ブールis_covbag(){ 58 のint DIR = 0 。 59 のために(int型 I = 0 ; I <= N- 1 ; ++ {i)が 60 のint TEM = SGN((P [I + 1 ] -p [I])^(P [I + 2 ] -p [I + 1 ]))。 61 IF(!DIR)は、DIRの= TEMを、 62である IF(TEM DIR * < 0)戻り 0 ; 63である } 64 リターン 1。; 65 } 66 // か否かを判定する内点 67 BOOL IS_IN(点O、ダブルPR){ 68 ダブル ANGは= 0 ; 69 用(INT I = 1 ; I <= N; ++ I){ 70 IF(SGN((OP [I])^(OPは、[I +は1。 ))]> = 0)(ANG + =角度O、P [I]は、P [I +は1]); 71である 他のAng-角=(P、O、P [I] [Iは+ 1 ]); 72 } 73れる IF(SGN(アン)== 0)戻り 0 ; // 外部 74 IF(SGN(アン- 2 * PI)== 0 || SGN(アン+ 2 * PI)== 0)リターン 1。 ; // 内 75 // エッジで 76 IF ==(SGN(PR)0)リターン 1。; 77 リターン 0 ; 78 } 79 //は多角形が円と交差するか否かを判断する 80 BOOLの is_right(点O、ダブルPR){ 81 のために(INT I = 1を、I <= N; ++ I){ 82 ダブル H = FABS((P [I] - )^(P [Iが+ O 1 ] -o))/ DIST(P [I]、P [Iは、+ 1。;]) 83 IF(SGN(H-PR)が< 0)戻り 0 ; 84 } 85 リターン 1 ; 86 } 87 INT メイン(){ 88 ながら(〜scanfの(" %のD "、&N)&& N> = 3 ){ 89 ダブルPR、PX、PY。 90 のscanf(" %LF%LF%LF "、&PR、&PX、&PY)。 91 のために(int型 I = 1 ; ++ I; iが<= N)のscanf(" %のLFの%のLF "、&P [i]は.X、&P [i]の.Y)。 92 P [N + 1 ] =(ポイント){P [ 1 ] .X、P [ 1 ] .Y}。 93 P [ 0 ] = (ポイント){P [N] .X、P [N]・Y}。 94 もし(!is_covbag()){ 95 (プット」HOLE ILL-形成されている" ); 96 } 97 他{ 98 なら!(!is_in((ポイント){PX、PY}、PR)|| is_right((ポイント){PX、PY}、PR))プット(" PEGは収まらない" ); 99の 他のプット(" PEGが収まる" ); 100 } 101 } 102 戻り 0 ; 103 }