我的凸包有以下代码: 第一部分按照凸出船体所需的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));
}
}
}
答案 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);