通过凸包传递数组

时间:2013-12-02 16:39:25

标签: java convex-hull

我的凸包有以下代码: 第一部分按照凸出船体所需的X值对数组进行排序,第二部分是我们给出的实际凸包代码,如何让我的数组通过凸包代码?我对java很新,对不起,如果这是一个简单的问题。谢谢!

import java.awt.Point;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;


public class FastConvexHull implements ConvexHullAlgorithm
{


public static void main(String args[]){
    int[][] ArrayList={{1,5},{3,9},{5,5},{4,1},{9,5},{6,9},{10,5}};
    Arrays.sort(ArrayList, new Comparator<int[]>(){
            public int compare(int[] a, int[] b){
                    //assumes array length is 2
                    int x,y;
                    if (a[0]!=b[0]) {
                            x=a[0];y=b[0];
                    }
                    else{
                            x=a[1];y=b[1];
                    }
                    if (x<y) return -1;
                    else if (x==y) return 0;
                    else return +1;
            }
    });
    for(int[] term: ArrayList){
            System.out.println(Arrays.toString(term));
    }
}
    public ArrayList<Point> execute(ArrayList<Point> points) 
    {
            ArrayList<Point> xSorted = (ArrayList<Point>) points.clone();
            Collections.sort(xSorted, new XCompare());

            int n = xSorted.size();

            Point[] lUpper = new Point[n];

            lUpper[0] = xSorted.get(0);
            lUpper[1] = xSorted.get(1);

            int lUpperSize = 2;

            for (int i = 2; i < n; i++)
            {
                    lUpper[lUpperSize] = xSorted.get(i);
                    lUpperSize++;

                    while (lUpperSize > 2 && !rightTurn(lUpper[lUpperSize - 3], lUpper[lUpperSize - 2], lUpper[lUpperSize - 1]))
                    {
                            // Remove the middle point of the three last
                            lUpper[lUpperSize - 2] = lUpper[lUpperSize - 1];
                            lUpperSize--;
                    }
            }

            Point[] lLower = new Point[n];

            lLower[0] = xSorted.get(n - 1);
            lLower[1] = xSorted.get(n - 2);

            int lLowerSize = 2;

            for (int i = n - 3; i >= 0; i--)
            {
                    lLower[lLowerSize] = xSorted.get(i);
                    lLowerSize++;

                    while (lLowerSize > 2 && !rightTurn(lLower[lLowerSize - 3], lLower[lLowerSize - 2], lLower[lLowerSize - 1]))
                    {
                            // Remove the middle point of the three last
                            lLower[lLowerSize - 2] = lLower[lLowerSize - 1];
                            lLowerSize--;
                    }
            }

            ArrayList<Point> result = new ArrayList<Point>();

            for (int i = 0; i < lUpperSize; i++)
            {
                    result.add(lUpper[i]);
            }

            for (int i = 1; i < lLowerSize - 1; i++)
            {
                    result.add(lLower[i]);
            }

            return result;
    }

    private boolean rightTurn(Point a, Point b, Point c)
    {
            return (b.x - a.x)*(c.y - a.y) - (b.y - a.y)*(c.x - a.x) > 0;
    }

    private class XCompare implements Comparator<Point>
    {

            public int compare(Point o1, Point o2) 
            {
                    return (new Integer(o1.x)).compareTo(new Integer(o2.x));
            }
    }

}

1 个答案:

答案 0 :(得分:0)

你的数组是一个int数组的数组(事实上:int [][])但是它的命名是 ArrayList 然而..

查看你的函数需要ArrayList(这是一个类)的Point s(这是另一个类)。您需要先将int[][]转换为ArrayList<Point>,然后才能将其提供给您的功能。例如,在主函数结束时(并确保重命名int[][] ArrayList局部变量):

ArrayList<Point> points = new ArrayList<Point>();
for (int [] pair : renamedArrayList){
    points.add(new Point(pair[0], pair[1]));
}
ArrayList<Point> result = execute(points);