半平面交(UESTC 484,Division)

2021-07-31 11:15:06 字數 1134 閱讀 7826

抄錯模板毀一生。。。

就是二分角度,用角度和起點構造乙個半平面去截原來的半平面,然後再計算新區域的面積。

二分的上下限是乙個比較麻煩的地方,正常情況下列舉起點和所有點之間的極角,然後記錄最大和最小值,分別當做上下限即可。

但是atan2()函式是返回與x軸正方向的夾角,逆時針為正,順時針為負,範圍是(-pi,pi],所以如果凸包跨越了-pi的角度,那麼就會出現一些錯誤。無論怎麼修正,一定會有乙個斷點,所以需要特殊處理。

由於起點一定在凸包的外面,所以特徵很明顯,那就是如果max-min>pi,那就說明一定是特殊情況了。

特判方法就是負的+2pi,然後取最大,正的取最小值,然後正常二分就好了。

**

#includeusing namespace std;

const int maxn = 110;

const double pi = acos(-1);

struct point

point(double x,double y):x(x),y(y){}

void read()

};typedef point vector;

const double eps = 1e-10;

int dcmp(double x)

vector operator - (point a,point b)

vector operator + (vector a,vector b)

vector operator * (vector a,double t)

vector operator / (vector a,double t)

double dot(vector a,vector b)

double cross(vector a,vector b)

struct line

line(point p,vector v):p(p),v(v)

bool operator < (const line& rhs) const

point gi(line a,line b)

int hi(line* l,int n,point* poly)

ans1();

}}int main()

return 0;

}

半平面交模板

妹的,一直沒有想清楚無解的情況到底是如何判斷的。偷來乙個模板。半平面交的結果 1.凸多邊形 後面會講解到 2.無界,因為有可能若干半平面沒有形成封閉3.直線,線段,點,空 屬於特殊情況吧 演算法 1 根據上圖可以知道,運用給出的多邊形每相鄰兩點形成一條直線來切割原有多邊形,如果多邊形上的點i在有向直...

模板 半平面交

考慮用射線 乙個點和乙個向量 表示它左側的半平面 那麼我們可以先按與x軸正半軸夾角 可用atan2 y,x 實現 排序,然後再用雙端佇列維護當前在交中的射線即可 之所以要用雙端佇列,是因為新插入乙個半平面時隊首和隊尾都有可能被彈出,而且要注意的是,要先彈隊尾再彈隊首 在最後,還要再用隊首的彈一些隊尾...

半平面交 板子

poj 2451 敲了個板子,比帶花樹稍微好一些,但是還是很麻煩.寫了點注釋 include include include define point vector const int n 2e4 10 struct vector vector double x,double y double an...