凸包问题是算法中经典的题目了,最近算法课讲分治问题时提到了Convex Hull,算法导论的书上也花了篇幅讨论了Convex Hull的求解,主要是Graham方法。

为了能更好地理解分治和Graham这两种解法,我决定自己动手把代码写一遍。

然而,在写之前,我发现我大一学的用行列式求解由三个点围城的三角形面积已经忘得差不多了,现在补充一下:

利用这个计算结果来判断点p3在p1p2直线的左侧还是右侧

下面是分治算法求解:

#include <iostream>
#include <algorithm>
#include <stdlib.h>
#define N 100
using namespace std;int n=0;
struct POINT
{int x,y;
}p[N],ans[N];
int visit[N],mark[N];
int Djudge(POINT a1,POINT a2,POINT a3)
{int calculate=a1.x*a2.y+a3.x*a1.y-a3.x*a2.y-a2.x*a1.y-a1.x*a3.y;return calculate;
}
bool cmpxy(const POINT a,const POINT b)
{if(a.x!=b.x)return a.x<b.x;elsereturn a.y<b.y;
}/*在涉及到平面上点对问题时,经常会按照这种方法对点进行排序
这与后面的sort(p,p+n,cmpxy)经常一起使用,在最近我做的2D maximal finding problem时,也是
使用了这样的排序对点对进行预处理。
*/
void DealLeft(int first,int last)
{int max=0,index=-1;int i=first;if(first<last){for(i=first+1;i<last;i++){int calcu=Djudge(p[first],p[i],p[last]);if(calcu==0)visit[i]=1;if(calcu>max){max=calcu;index=i;}}}else{for(i-1;i>last;i--){int calcu=Djudge(p[first],p[i],p[last]);if(calcu==0)visit[i]=1;if(calcu>max){max=calcu;index=i;}}}if(index!=-1){visit[index]=1;DealLeft(first,index);DealLeft(index,last);}
}
int main()
{cout<<"Enter the number of the points: ";cin>>n;cout<<"Enter the points: ";for(int i=0;i<n;i++){cin>>p[i].x>>p[i].y;visit[i]=0;}visit[0]=1;visit[n-1]=1;sort(p,p+n,cmpxy);DealLeft(0,n-1);DealLeft(n-1,0);int t=0;for(int i=0;i<n;i++){if(visit[i]==1){ans[t].x==p[i].x;ans[t].y==p[i].y;t++;}}
//顺时针输出mark[0]=mark[t-1]=1;for(int i=1;i<t-1;i++)mark[i]-0;cout<<ans[0].x<<" "<<ans[0].y<<endl;for(int i=1;i<t-1;i++){int d=Djudge(ans[0],ans[t-1],ans[i]);if(d>=0){cout<<ans[i].x<<" "<<ans[i].y<<endl;mark[i]=1;}}cout<<ans[t-1].x<<" "<<ans[t-1].y<<endl;for(int i=1;i<t;i++){if(mark[i]!=1){int d=Djudge(ans[0],ans[t-1],ans[i]);if(d<0){cout<<ans[i].x<<" "<<ans[i].y<<endl;}}}return 0;
}

转载于:https://www.cnblogs.com/CuteyThyme/p/10596679.html

寻找凸包 (Convex Hull)相关推荐

  1. OpenCV 凸包Convex Hull

    OpenCV 凸包Convex Hull 凸包Convex Hull 目标 代码 结果 凸包Convex Hull 目标 在本教程中,您将学习如何: 使用OpenCV函数cv :: convexHul ...

  2. MATLAB凸包Convex hull运算

    凸包Convex hull运算(求离散点的边界) [k,a] = convhull(x,y); K = convulln(X, options); [K AV] = convexHull(DT); t ...

  3. 凸包 (Convex Hull)

    凸包的定义 在一个多边形边缘或内部,任意两个点的连线都包含在多变形边界或者内部. 正式定义:包含点集合 S 中所有点的最小凸多边形称为凸包. 凸包是一个计算几何中常见的概念.给定二维平面上的点集,凸包 ...

  4. 寻找凸包的graham 扫描法

    1,点集Q的凸包(convex hull)是指一个最小凸多边形,满足Q中的点或者在多边形边上或者在其内.  2,凸包最常用的凸包算法是Graham扫描法和Jarvis步进法.  3,Graham扫描法 ...

  5. R语言为散点图添加凸包(convex hull):数据预处理(创建一个包含每组数据凸包边界的数据集)、ggplot2使用geom_polygon函数为可视化图像添加凸包(convex hull)

    R语言为散点图添加凸包(convex hull):数据预处理(创建一个包含每组数据凸包边界的数据集).ggplot2使用geom_polygon函数为可视化图像添加凸包(convex hull) 目录

  6. P6810 「MCOI-02」Convex Hull 凸包

    P6810 「MCOI-02」Convex Hull 凸包 思路 ∑i=1n∑j=1mτ(i)τ(j)τ(gcd(i,j))∑d=1nτ(d)∑i=1nd∑j=1mdτ(id)τ(id)[gcd(i, ...

  7. Monotone Chain Convex Hull(单调链凸包)

    1 Monotone Chain Convex Hull(单调链凸包)算法伪代码: 2 //输入:一个在平面上的点集P 3 //点集 P 按 先x后y 的递增排序 4 //m 表示共a[i=0...m ...

  8. 清华计算几何大作业(一):CG2017 PA1-1 Convex Hull (凸包)

    CG2017 PA1-1 Convex Hull (凸包) 1. 前置知识 2. 思路分析 3. 伪代码 4. 可视化结果示例 5. 项目代码(待更新完整) 1.1.1 Numerical Tests ...

  9. JavaScript:实现Convex hull凸包问题算法(附完整源码)

    JavaScript:实现Convex hull凸包问题算法 function compare (a, b) {// Compare Function to Sort the points, a an ...

最新文章

  1. maven生命周期理解
  2. android五大布局的用法,android:stretchColumns用法
  3. flex 会使div撑满_如何讲清楚Flex弹性盒模型?(中)
  4. java mp4 视频时间戳_MP4文件中音视频时间戳的计算
  5. 微型计算机中存储器分成哪几个等级?它们各有什么特点?用途如何?,《微机原理》复习思考题第十二章存储器.DOC...
  6. 一种新的子波域滤波算法
  7. 银行不放款可以换银行贷款吗?
  8. VM虚拟机的三种网络连接模式
  9. discuz 登录代码流程
  10. java中string的方法_Java中String常用方法
  11. proteus信号峰值检测仪仿真
  12. python词云生成与设计实现_python简单词云生成
  13. jpa执行插入报error performing isolated work错误
  14. 如何找到精美联想锁屏壁纸?
  15. LPC1768 双通道ADC采集数据并发送
  16. 【linux C】基础
  17. offsetLeft理解以及MouseEvent接口中的screenX,clientX,pageX,offsetX区别.
  18. 如何开发自己的HttpServer-NanoHttpd源码解读
  19. 【图像分类损失】PolyLoss:一个优于 Cross-entropy loss和Focal loss的分类损失
  20. 图片img标签设置默认图片

热门文章

  1. 并发编程-15并发容器(J.U.C)核心 AbstractQueuedSynchronizer 抽象队列同步器AQS介绍
  2. Java-Java I/O流解读之基于字节的I / O和字节流
  3. Shell echo-使用echo实现更复杂的输出格式控制
  4. java 线程池 源码_java线程池源码分析
  5. python上下文管理器
  6. 基础理论:啥是分布函数CDF、啥叫联合分布?
  7. php 请求转发 重定向,PHP怎么实现页面重定向?(图文+视频)
  8. no scp yes 不提示_linux脚本实现scp命令自动输入密码和yes/no等确认信息
  9. JavaScript开发优化技巧
  10. Matlab直线一级倒立摆控制方法研究