計算幾何中長遇到的問題:判斷特定點是否在平面多邊形內部。向量叉積是一種方法,用於凸多邊形。【優角:角度值大於180度小於360度。凸多邊形:沿著多邊形的一邊做一條直線,如果剩下所有的部分都在直線的同側,那麼稱這是乙個凸多邊形,凸多邊形是沒有優角的】
判斷:連線第i條邊的第乙個端點和測試點成向量u,再連線第乙個端點與第二個端點成向量v,記錄叉積結果,除第一條邊外,叉積結果和上一條邊對應的叉積的乘積是正數的話繼續判斷,負數則不在多邊形內。
結果為正也就意味著點和邊的時針方向是一致的,邊按照一定的時針方向構成多邊形。所有點都是如此的話點自然在多邊形的內部。
struct edge;
bool inside(point p,edge,int n)
return 1;
}
問題:
大意是尋找在如上的不同分割槽中有多少的點。本題用兩種做法:1. 用叉積判斷點在邊的左右,加二分查詢
我們已知乙個事實:
用叉積函式計算
int cross(point p1,point p2,point p0)
得到的結果和兩個向量的夾角的余弦值相關,如果它是正數就是逆時針方向,負數就是順時針方向。(逆正順負——前提是函式的引數不要弄錯了)
於是將題目中的edge兩個端點作為p1,p2,根據正負就能判斷點是在邊的左右。正在左,負在右。
為加快查詢速度,輸入乙個點就用二分找到對應的分割槽位置。叉積大於0則在邊的左邊,繼續向左找,小於0在邊的右邊,繼續向右找,直到low=high跳出迴圈,這時的high和low的變化要注意,不同於mid+1,mid-1。下面**中的sum[i]的下標代表多邊形的右邊。#include #include #include using namespace std;
const int maxn=5e3+10;
struct point ; //point[maxn]
struct edgeedge[maxn];
int sum[maxn];
int multi(point p1,point p2,point p0)
/*常用二分是low=1,high=length,mid; low=mid+1; high=low-1;
這裡low=1; high=length; mid; low=mid+1; high=mid;
*/void midfind(point p,int n)
for(int i=0;i
2. 用叉積計算多邊形面積,直接遍歷查詢。
另一種思路相對簡單,我們直接用叉積求面積,對於乙個由左右兩線段和上下平行線圍成的梯形,如果面積相等就在多邊形內部,大於原來的多邊形面積就在外部。直接二重遍歷即可。
#include #include #include #include using namespace std;
typedef long long ll;
struct point;
struct edgeeg[5050];
int cnt,sum[5050];
int cmp(edge a,edge b){
int m1=min(a.pl.x,a.pr.x),q1=max(a.pl.x,a.pr.x);
int m2=min(b.pl.x,b.pr.x),q2=max(b.pl.x,b.pr.x);
return m1
多邊形判斷點內外
在圖形學中判斷乙個點是否在多邊形內,若多邊形不是自相交的,那麼可以簡單的判斷這個點在多邊形內部還是外部 若多邊形是自相交的,那麼就需要根據非零環繞數規則和奇 偶規則判斷。判斷多邊形是否是自相交的 多邊形在平面內除頂點外還有其他公共點 內 外測試 不自交的多邊形 多邊形僅在頂點處連線,而在平面內沒有其...
演算法 點在多邊形內外判斷
射線發 射線發判斷點是否在多邊形內部 p 待判斷的點。格式 poly 多邊形定點,陣列成員格式相同 private string raycasting point p,listpoly 判斷線段兩短點是否在射線兩側 if sy py sy py tyif x px return flag in ou...
點在多邊形內外的判斷
點與多邊形的的位置關係 點在形內 點在形外 點在邊界上 判斷方法 射線法 轉角法 射線法 通常取x軸正方向為射線方向 奇數次相交,則在形內 偶數次相交,則在形外 對於凹多邊形也是可以的 射線法的特殊情況 與定點相交 與其相鄰的端點或者線段在射線的異側,則認為是相交 否則不認為相交 與邊部分重合 縮點...