计算几何基础-2
文章目錄
- 直線:
- 圖形:
- 求垂足
- 求兩圓交點
- 直線與圓交點
- 多邊形問題
- 判斷一個點是否在任意多邊形內部
- Pick定理
- 凸包
- 求點集的凸包
- 水平法:
- 增量法:
- 半平面
- 半平面交
- 求半平面交
直線:
struct Line{point p,v;Line(){}Line(point _p.point _v):p(_p),v(_v){} }L[N];圖形:
求垂足
point vp(Line l,point p)//求p點向l做垂線得到的垂足 {double Dis=dis(l,p);//求p到l的距離Dis Dis=Dis*Dis;double pDis=(p-l.p).length();//求AP距離pDis pDis=pDis*pDis;double vDis=sqrt(pDis-Dis);//勾股定理得到AH距離 point ans=l.p+l.v*(vDis/l.v.length());//通過方向單位向量乘長度得到路徑,加起點得到答案 return ans; }求兩圓交點
代碼:
直線與圓交點
代碼:
點+單位向量 * 長度
多邊形問題
平面上n個點收尾順次連接組成的平面圖形
可能是凸多邊形或者凹多邊形
判斷一個點是否在任意多邊形內部
從這個點出發引一條射線,如果這個射線與多邊形有奇數個交點則在內部,否則在外部
double calc_S() {double ans=0;int n=poly.size();for(int i=1;i<n;i++)ans+=poly[i-1]^poly[i];ans+=poly[n-1]^poly[0];return ans/2; }Pick定理
對于頂點都是整點的多邊形,設其面積為S,多邊形內部的點數為a,邊上的點數為b,那么滿足:
S = a + b/2 - 1
凸包
給出一個二維平面內的點集,如果任意兩個點的連線都在點集內,則這個點集是個凸集
對于給定的散點集X,包含X的所有凸集的交集S叫做X的凸包
點就是墻上的釘子,用一個橡皮筋套在外面,收縮后形成的凸多邊形就是凸包
求點集的凸包
水平法:
凸包一般使用水平法求解
將凸包分為上凸殼和下凸殼兩部分,分別求解
每一部分按照x的坐標排序,用單調棧維護,利用叉積的符號判斷凹凸性
增量法:
判斷情況:
此時B合法
此時B不合法
不合法的點一定是最后添加入S的,且是連續的
半平面
? 顧名思義,就是平面的一半。一條直線會把平面分成兩部分,就 是兩個半平面。對于半平面,我們可以用直線方程式如: ax+by+c > 0 表示,更常用的是用直線表示
半平面交
? 顧名思義,就是多個半平面求交集。其結果可能是一個凸多邊形、 無窮平面、直線、線段、點等。 ? 什么時候需要半平面交?
? 1. 二維線性規劃 (高中數學)
? 2. 求多邊形的核 ? 多邊形的核:如果多邊形中存在一個區域使得在區域中可以看到 多邊形中任意位置(反之亦然),則這個區域就是多邊形的核
求半平面交
? 理論上有很多很多種求法,但是在實際應用中效率最高而且最好 寫的是 S&I 增量法,也就是一個一個插入半平面并且更新答案。
? 核心思想:
? 1. 選取逆時針方向為正方向,把所有的直線變成向量。
? 2. 所有的向量按照極角排序,角度相同的保留左邊的。
? 3. 按照順序每次插入一個平面,刪掉右面的部分,保留左邊的部 分。
###具體方法:
1.選方向,排序(如上文)
? 2.用雙端隊列保存構成當前核的所有向量。
? 3.按照順序遍歷所有向量,每次加入判斷影響
? 假設隊列中最后兩條直線的交點是左圖所示。如果新加入了直線 后原來的交點在直線右側,說明最后一條直線沒有用,把它從隊 列中刪除。
看遍邊6要不要保留,就看5和6的交點在直線的哪一側
由p指向v的向量
ans存的交點
q存的邊
總結
- 上一篇: 计算几何基础-1
- 下一篇: 中医的针灸能不能治好青光眼