这是使用礼品包装算法找到凸包的伪代码:
步骤1:给定一个点S列表,让S中的点标记为s0,s1, ......,sk。选择最右边的最低点S.如图24.9a,h0所示 是这样的一点。将h0添加到列表H.(H最初为空.H将保留所有 算法完成后,凸包中的点。)设t0为h0。
步骤2:设t1为s0。 对于S中的每个点p, 如果p在从t0到t1的直线的右侧,那么 让t1成为p。 (在步骤2之后,从t0直线的右侧没有任何点 到t1,如图24.9b所示。)
步骤3:如果t1为h0(见图24.9d),则H中的点形成凸起 换句话说,将t1添加到H,让t0为t1,然后返回步骤2 (见图24.9c)。
这是我到目前为止所做的事情:
public void getConvexHull(ArrayList<Point> points) {
ArrayList<Point> h = new ArrayList<Point>();
points.sort(new YComparator());
h.add(points.get(points.size()-1)); // Add the rightmost lowest point to h
Point t0 = h.get(0);
Point t1 = points.get(0);
while(true) {
for(int i = 0; i<points.size(); i++) {
if(isRight(t0,t1,points.get(i)) == 1) {
t1 = points.get(i);
}
}
if(t1.equals(h.get(0))) {
break;
}
h.add(t1); // The exception occurs at this line
t0 = t1;
t1 = points.get(0);
}
for(Point x: h)
System.out.println(x);
}
isRight()
方法:
public int isRight(Point a, Point b, Point c){
int pos = ((b.x - a.x)*(c.y - a.y) - (b.y - a.y)*(c.x - a.x));
if(pos < 0) {
return 1;
}
else if(pos > 0) {
return -1;
}
else {
return 0;
}
}
如果Point c
位于通过加入Point a
和Point b
形成的行的右侧,则此方法返回true。
[我觉得这个方法有问题]
YComparator
类:
public class YComparator implements Comparator<Point>{
@Override
public int compare(Point a, Point b) {
if(a.y > b.y) {
return 2;
}
else if(a.y < b.y) {
return -2;
}
else if(a.y == b.y) {
if(a.x > b.x) {
return 1;
}
else if(a.x < b.x) {
return -1;
}
}
return 0;
}
}
当我运行程序时,它会抛出java.lang.OutOfMemoryError: Java heap space
异常。
答案 0 :(得分:1)
试试这个:
while(flag) { ...
然后移动:
if(t1.equals(h.get(0))) {
flag = false;
}
进入for
循环。