二维凸包问题

凸包问题

点集Q的凸包是指一个最小凸多边形,Q中的点或者在这个最小凸多边形边上或者在其内部。二维平面上的凸包问题就是对于一组平面上的点,求一个包含所有点的最小的凸多边形。

图1 示例图

解决二维凸包问题的方法有很多,主要有分治法,Graham扫描法,Jarvis步进法等。

其中Jarvis步进法是通过夹角来进行点的寻找与加入,可以先将最靠左下方的点作为初始点,之后以该点为起点,y轴正方向为轴,逐个加入逆时针方向角度最小的一个点以及连成的边加入集合中,并作为下一次寻找的起点来进行循环的操作,直到最后回到最左下处的初始点,此时集合内元素即为二维凸包问题的解。

一个实现:

    public static int triplet(Point p,Point q,Point r)  {
	    double val = (((int)q.y()-(int)p.y())*((int)r.x()-(int)q.x()))-(((int)q.x()- 
                     (int)p.x())*((int)r.y()-(int)q.y()));
		if(val == 0) {
		    return 0;
		}
		return (val > 0)? 1 : 2;
	}
    
    public static Set<Point> convexHull(Set<Point> points) {	
    	if (points.size()<3) {
    		return points;
    	}
    	Set<Point> hull = new HashSet<Point>();
    	List<Point> list = new ArrayList(points);
    	int n=points.size();
    	int l=0,q;
    	for(int i=1; i<n; i++) {
    		if((int)list.get(i).x()<(int)list.get(l).x())
    		{
    			l = i;
    		}
    	}
    	int p=l;
    	do
    	{
    		hull.add(list.get(p));
    		q = (p+1)%(n-1);
    		
    	   for(int i=0; i<n; i++)
    	   {
    		    if(triplet(list.get(p),list.get(i),list.get(q)) == 2)	
    			{
    				q = i;
    			}
    	   }
    	p = q;
    	}while(p!=l);
    	return 	hull;
    }

凸包问题描述:https://baike.baidu.com/item/%E5%87%B8%E5%8C%85/179150?fr=aladdin

参考:https://blog.csdn.net/u011001084/article/details/72768075

           https://blog.csdn.net/zbspy_zjf/article/details/78822132

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值