使用礼品包装算法

时间:2015-09-05 09:01:09

标签: java algorithm convex-hull

这是使用礼品包装算法找到凸包的伪代码:

步骤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)。 enter image description here

这是我到目前为止所做的事情:

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 aPoint 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异常。

1 个答案:

答案 0 :(得分:1)

试试这个:

while(flag) { ...

然后移动:

if(t1.equals(h.get(0))) {
    flag = false;
}

进入for循环。