判斷凸包相離(點集劃分,uva 10256)

2021-07-26 11:54:17 字數 1227 閱讀 4004

如何判斷兩個凸包是否相離呢?

需要檢查

(1)兩個凸包上的線段是否彼此相交,如果線段彼此相交,那麼就一定不相離。(說明邊界有公共部分)

(2)任意乙個點是否在另乙個凸包內,如果找到了那麼乙個點在另乙個凸包內,那麼就一定不相離。(說明內部有公共部分)

(3)對於退化成點和線段的凸包要特殊判斷。

**#includeusing namespace std;

const int maxn = 510;

struct point

bool operator < (const point& rhs) const

int k=m;

for(int i=n-2;i>=0;i--)

if(n>1) m--;

return m;

}bool onsegment(point p,point a,point b)

bool segmentintersection(point a1,point a2,point b1,point b2)

int ispointinpolygon(point p,point* poly,int n)

if(wn!=0) return 1;

else return 0;

}int m,c,m1,m2;

point a[maxn];

point b[maxn];

point ans1[maxn],ans2[maxn];

bool ok()

{ if(m1==1&&m2==1) return dcmp(len(ans1[0]-ans2[0]))?true:false;

else if(m1==1&&m2==2) return !onsegment(ans1[0],ans2[0],ans2[1]);

else if(m1==2&&m2==1) return !onsegment(ans2[0],ans1[0],ans1[1]);

else if(m1==2&&m2==2) return !segmentintersection(ans1[0],ans1[1],ans2[0],ans2[1]);

else if(m1==1) return !ispointinpolygon(ans1[0],ans2,m2);

else if(m2==1) return !ispointinpolygon(ans2[0],ans1,m1);

else if(m1==2)

{for(int i=0;i

opencv計算點集凸包

點集求凸包的問題經常會遇到,給出了一種思路,有空了再仔細研究,本文總結了opencv中相關的方法並給出乙個例項。參考 hull cv.convexhull points hull clockwise returnpoints 引數說明 points 點集。需要注意的是,該引數輸入的座標系是向右為x,...

31 幾何演算法 點集的凸包

extern c class algorithmlib convexhull convexhull convexhull convexhull convexhull datastruct stack dynstack convexhull run const datastruct array dyn...

平面點集的凸包問題

平面點集的凸包可理解為包含所有點的最小凸多邊形 點可以在多邊形邊上或在其內 這裡給出一種求解方法。先找所有點中 y 座標最大最小的點pmax pmin,所找點必定是凸包上的點 找距離直線pmaxpmin兩側最遠的點p1,p0,構成初始三角形 再對每個三角形新生成的邊 和 繼續找與改變對應頂點 不在同...