按照順時針或逆時針方向輸入乙個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 #include3 #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 極角排序耗時 先取出乙個端點,必須為凸包上的乙個點,取最下且最右的點即可 以端點進...