POJ 1584 計算幾何 凸包

2021-09-02 23:55:41 字數 2720 閱讀 3178

按照順時針或逆時針方向輸入乙個n邊形的頂點座標集,先判斷這個n邊形是否為凸包。

再給定乙個圓形(圓心座標和半徑),判斷這個圓是否完全在n變形內部。

1、判斷凸包convex():

由於點集已經按某個時針方向有序,因此可以先定義乙個方向係數dir=0

兩兩枚舉n邊形的邊,用叉積判斷這兩條邊的轉向(右螺旋或左螺旋),由於存在散點共線的情況,因此當且僅當叉積的值t第一次不為0時,dir=t,dir的值此後不再改變。(dir>0 則為右螺旋逆時針,dir<0則為左螺旋順時針)

此後繼續列舉剩下的邊,只要判斷dir*t>=0即可,當存在乙個dir*t<0的邊,說明這是凹多邊形,就不是凸包了。

2、判斷圓心在不在凸包內contain()

3、當圓心在凸包內時,判斷距離是否都大於半徑fit()

1 #include 2 #include 

3 #include 4 #include 5 #include 6 #include 7 #include

8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15

using

namespace

std;

16#define rep(i,a,n) for (int i=a;i17

#define per(i,a,n) for (int i=n-1;i>=a;i--)

18#define all(x) (x).begin(),(x).end()

19#define pb push_back

20#define mp make_pair

21#define lson l,m,rt<<1

22#define rson m+1,r,rt<<1|1

23 typedef long

long

ll;24 typedef vectorvi;

25 typedef pairpii;

26const ll mod = 1e9 + 7;27

const

int inf = 0x3f3f3f3f;28

const

int maxn = 1010;29

//head

3031

const

double eps = 1e-8;32

int cmp(double

x) 37

38const

double pi = acos(-1

);39 inline double sqr(double

x) 42

struct

point

45 point(double a, double

b) :x(a), y(b) {}

46void

input()

49 friend point operator+(const point &a, const point &b)

52 friend point operator-(const point &a, const point &b)

55 friend point operator*(const

double &a, const point &b)

58 friend point operator/(const point &a, const

double &b)

61double

norm()

64};

65double

det(point a, point b)

68double

dot(point a, point b)

71double

dist(point a, point b)

7475

struct

line

78line(point x, point y) :a(x), b(y) {}

79};

80double

dis_point_segment(point p, point s, point t)

85bool

point_on_segment(point p, point s, point t)

88bool

parallel(line a, line b)

91bool line_make_point(line a, line b,point &res)

9899

intn;

100double

r;101

point o;

102 point *p;

103104

bool

convex()

111return

true

;112

}113

114bool

contain()

122}

123return

true

;124

}125

126bool

fit()

131return

true

;132

}133

134int

main()

149delete

p;150

}151

return0;

152 }

計算幾何 凸包

有多個手機訊號發射器,求解乙個最小區域,要求所有的發射器都包含在這個最小區域中,並且任意兩台發射器之間的交流包含於在這個區域內。將所有的發射器看做為點,任意兩個點之間的連線都包含於乙個平面s 乙個平面的子集s 是凸的,當且僅當 s中的任意兩個點之間的連線都包含於 s中。點集 p的凸包是所有包含 p的...

計算幾何 凸包

如求凸包周長 include include include include include include using namespace std define pi 3.1415926 define eps 1e 10 class point 建立point類,裡面包含很多point的運算子 定...

計算幾何 凸包

凸多邊形 任意兩個頂點的連線都在多邊形內部,這樣的多邊形稱為凸多邊形 凸包的定義 乙個凸多邊形的頂點的集合 求凸包的一般形式 給出乙個點集,求出覆蓋所有點的最小凸多邊形 graham演算法 時間複雜度 o nlogn 極角排序耗時 先取出乙個端點,必須為凸包上的乙個點,取最下且最右的點即可 以端點進...