一、凸包问题是什么
假设平面上有p0~p12共13个点,过某些点作一个多边形,使这个多边形能把所有点都“包”起来。当这个多边形是凸多边形的时候,我们就叫它“凸包”。
二、Gift-wrapping算法实现
1.算法概述
顾名思义,Gift-wrapping算法即将点集从最左下点开始,像礼物包装一样,通过一个方向,将最外层点加入凸包的点集,最后回到出发点,获取的完整点集即为该点集的凸包
2.代码实现
要注意,当三个点共线时,应选择距离当前点距离最大的点加入凸包点集
public static Set<Point> convexHull(Set<Point> points) {
ArrayList<Point> pointlist=new ArrayList<>();
Set<Point> hashpoint=new HashSet<>();
pointlist.addAll(points);
if(pointlist.size()<=3) return points;
Point stpoint=pointlist.get(0);
for(Point p:points)
{
if(p.x()<stpoint.x()||(p.x()==stpoint.x()&&p.y()<stpoint.y()))
{
stpoint=p;
}
}
Point fp=stpoint,tmp=null,reg=null;
double current=0,angle=0,anglemin=360,tmpdis2=0,tmpdis1=0;
int i=0;
do
{
i++;
tmpdis2=0;tmpdis1=0;
if(i==3) points.add(stpoint);
for(Point p1:points)
{
angle=calculateBearingToPoint(current,(int)fp.x(),(int)fp.y(),(int)p1.x(),(int)p1.y());
if(angle<anglemin)
{
anglemin=angle;
reg=p1;
tmp=p1;
}
if(angle==anglemin)
{
tmpdis1=(p1.x()-reg.x())*(p1.x()-reg.x())+(p1.y()-reg.y())*(p1.y()-reg.y());
tmpdis2=(p1.x()-fp.x())*(p1.x()-fp.x())+(p1.y()-fp.y())*(p1.y()-fp.y());
if(tmpdis1<tmpdis2)
{
reg=p1;
tmp=p1;
}
}
}
current=0;
anglemin=360;
fp=tmp;
hashpoint.add(tmp);
points.remove(tmp);
}while(tmp!=stpoint||i<=pointlist.size());
return hashpoint;
}