Poj1584 [] [] [テンプレート]は、それがラウンド凸包か否かが判断され、ポリゴンはいくつかの凸包を数えるかどうかを決定します

トピックへのリンク:https://vjudge.net/problem/POJ-1584

ポリゴンが凸包であるかどうかを尋ねることは凸包であり、その後、Q円は凸包内、中心を決定する最初の凸包決定半径と中心から端までの距離内である(等しい面積法を用い、これは外積です)関係。

3つのテンプレートを一緒に入れて。

  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 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/xiaobuxie/p/11565020.html