求半平面交的點集

2021-07-04 17:00:34 字數 860 閱讀 4663

///

struct line

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

bool operator < (const line& l) const

};// 點p在有向直線l的左邊(線上不算)

bool onleft(const line& l, const point& p)

// 二直線交點,假定交點惟一存在

point getlineintersection(const line& a, const line& b)

const double inf = 1e8;

// 半平面交主過程

point anspoly[maxn]; //半平面交的多邊形點集

int halfplaneintersection(vectorl)

if(first < last) p[last-1] = getlineintersection(q[last-1], q[last]);

}while(first < last && !onleft(q[first], p[last-1])) last--; // 刪除無用平面

if(last - first <= 1) return 0; // 空集,0個點

p[last] = getlineintersection(q[last], q[first]); // 計算首尾兩個半平面的交點

// 從deque複製到輸出中

int index=0;

for(int i = first; i <= last; i++) anspoly[index++]=p[i];

return index;

}

半平面交模板

妹的,一直沒有想清楚無解的情況到底是如何判斷的。偷來乙個模板。半平面交的結果 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...