c++凸包分治算法-凸包(ConvexHull)问题的三种解法:暴力GrahamScan分治_第1页
c++凸包分治算法-凸包(ConvexHull)问题的三种解法:暴力GrahamScan分治_第2页
c++凸包分治算法-凸包(ConvexHull)问题的三种解法:暴力GrahamScan分治_第3页
c++凸包分治算法-凸包(ConvexHull)问题的三种解法:暴力GrahamScan分治_第4页
c++凸包分治算法-凸包(ConvexHull)问题的三种解法:暴力GrahamScan分治_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、c+_ConvexHull)问题的三种解法:暴GrahamScan,分治#include#include#include#include#include#include#include#include#includeusing namespace std;using namespace cv;#define e 3.3621e-4932Point2f pmin;bool SameSide(Point2f A,Point2f B,Point2f C,Point2f P)long double k = (long double)(A.y - B.y) / (A.x - B.x);long doub

2、le b = A.y - k * A.x;if (C.y - k*C.x - b = e & P.y - k*P.x - b = e) | (C.y - k*C.x - b = e & P.y - k*P.x - b = e)return true;elsereturn false;bool PointinTriangle1(Point2f A,Point2f B,Point2f C,Point2f P)return SameSide(A, B,C,P) & SameSide(B, C,A,P) & SameSide(C, A,B,P);bool cmpBy_yr(Point2f a, Poi

3、nt2f b)return a.y b.y;bool cmpBy_x(Point2f a, Point2f b)return a.x 0 | (v1 = 0 & m1 m2);void drawLine(vector points, vector p)vector left, right;int num = p.size();int miny_index = 0,maxy_index = 0;float k, b;Mat Draw_Convex_Hull(600, 600,CV_8UC3,Scalar(255, 255,255);for (int i = 0;i points.size();

4、i+)circle(Draw_Convex_Hull, pointsi, 1,Scalar(0, 0,0),1);for (int i = 0;i num;i+)if (pi.y pmaxy_index.y)maxy_index = i;k = (pmaxy_index.y - pminy_index.y) / (pmaxy_index.x - pminy_index.x);b = pmaxy_index.y - k*pmaxy_index.x;for (int i = 0;i 0)left.push_back(pi);elseright.push_back(pi);sort(right.be

5、gin(), right.end(), cmpBy_yr);sort(left.begin(), left.end(), cmpBy_yl);for (int i = 0;i right.size() - 1;i+)line(Draw_Convex_Hull,righti,righti+1, Scalar(0, 0,255),2);waitKey(30);for (int i = 0;i left.size() - 1;i+)line(Draw_Convex_Hull, lefti, lefti + 1, Scalar(0, 0,255),2);waitKey(30);line(Draw_Co

6、nvex_Hull, rightright.size() - 1, left0, Scalar(0, 0,255),2);line(Draw_Convex_Hull, leftleft.size() - 1, right0, Scalar(0, 0,255),2);imshow(Convex Hull, Draw_Convex_Hull);waitKey(0);void bruteForce(vector &p,vector &vec)int num = p.size();int min_index = 0;Point2f min = p0, tmp;vector flag(num,true)

7、;for (int i = 1;i num;i+)if (pi.y min.y)|(pi.y = min.y & pi.x min.x)min = pi;min_index = i;tmp = p0;p0 = min;pmin_index = tmp;vec.push_back(p0);for(int i = 1;i num;i+)for(int j = 0;j num;j+)for (int k = j+1; k num;k+)if (i != j&i != k)if (PointinTriangle1(pj, pk, p0, pi)flagi = false;for (int i = 1;

8、i num;i+)if (flagi)vec.push_back(pi);void grahamScan(vector &p,vector &vec)vector ang;int num = p.size();int min_index = 0;Point2f min = p0, tmp ,top1, top;vector flag(num, true);for (int i = 1;i num;i+)if (pi.y min.y) | (pi.y = min.y & pi.x min.x)min = pi;min_index = i;tmp = p0;p0 = min;pmin = min;

9、pmin_index = tmp;vec.push_back(p0);sort(p.begin() + 1,p.end(), cmpBy_ang);vec.push_back(p1);vec.push_back(p2);for (int i = 3;i 2)vec.pop_back();vec.push_back(pi);void Divide_Conquer(vector &p,int l, int r, vector &vec)if (r - l 3)return;if (r - l = 3)vec.insert(vec.end(), p.begin() + l, p.begin() +

10、r + 1);return;double countx = 0;for (int i = l; i = r; i+)countx += pi.x;countx /= (r - l + 1);int k = (l + r) / 2;vector temp_left, temp_right, answer;Divide_Conquer(p, k + 1,r, temp_right);Divide_Conquer(p, l, k, temp_left);temp_left.insert(temp_left.end(), temp_right.begin(), temp_right.end();gra

11、hamScan(p, answer);vec.insert(vec.end(),answer.begin(),answer.end();void Divide_Conquer_Warp(vector &p,vector &vec)sort(p.begin(), p.end(), cmpBy_x);Divide_Conquer(p, 0,p.size() - 1,vec);int main()float x, y;int num = 100;vector vp2f;vector con_hull;LARGE_INTEGER t1, t2, tc;QueryPerformanceFrequency

12、(&tc);srand(time(NULL);for (int i = 0;i num;i+)x = rand()*1. / (RAND_MAX / 500.);y = rand()*1. / (RAND_MAX / 500.);vp2f.push_back(Point2f(x, y);/bruteForce/* QueryPerformanceCounter(&t1); bruteForce(vp2f,con_hull); QueryPerformanceCounter(&t2); cout Point Numbers: num t Time of Brute Force: (t2.Quad

13、Part - t1.QuadPart)*1.0 / tc.QuadPart endl;drawLine(vp2f,con_hull);*/ Graham ScanQueryPerformanceCounter(&t1);grahamScan(vp2f, con_hull);QueryPerformanceCounter(&t2);cout Point Numbers: num t Time of Graham_Scan: (t2.QuadPart - t1.QuadPart)*1.0 / tc.QuadPart endl;drawLine(vp2f, con_hull);/ Divide and Conquer/* QueryPerformanceCounter(&t1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论