如何从数组Java中的一个点找到3个最接近的坐标

时间:2016-10-19 20:04:42

标签: java arrays coordinates closest-points

我有一份家庭作业,我完全陷入困境(等级:初学者)。

我必须创建一个方法,找到距用户条目3个最近距离和数组中的所有点 - 我被困在这里。

方法是: public static int [] troisPlusProches(int x,int y,int [] coordonneesHabitations) 其中int x和int y是用户条目,数组int [] coordonneesHabitations是int [] coordonneesHabitations = {9,30,18,8,3,18,25,36}。 所以得分是(9,30),(18,8),(3,18)和(25,36)。

我使用公式:distance = Math.sqrt(((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2)))来计算距离。

现在我必须从用户条目中找到3个最短距离并在新阵列中返回它们的位置。

因此,如果用户条目是x = 10,则y = 15。

距离点(3,18)最短距离是7.616,下一个距离点(18,8)是10.630,第三个距离点(9,30)是15.033。 在这种情况下,该方法应该返回一个数组int [] troisPlusProches = {3,18,18,8,9,30}。

我知道我必须做什么,我只是无法弄清楚......

这是许多错误尝试中的一个:

public static int[] troisPlusProches (int x, int y, int[] (coordonneesHabitations) 
{
    int [] that = Arrays.copyOf(coordonneesHabitations, coordonneesHabitations.length);
    int table[] = new int[6];
    double distanceA = 0.0; 
    double minDistance = Float.MAX_VALUE;
    int a = 0;
    int b = 0;
    int i = 0;
    double ignore = Float.MAX_VALUE;
    double ignore2 = Float.MAX_VALUE;

    for (i = 0; i < that.length; i += 2) {
           a = that[i];
           b = that[i+1]; 
           distanceA = calculerDistance(a, b, x, y);
           if (distanceA < minDistance) { 
               minDistance = distanceA;
               table[0] = a;
               table[1] = b;
           }
       }
    ignore = minDistance;


    for (i = 0; i < that.length; i += 2) {
           a = that[i];
           b = that[i+1]; 
           distanceA = calculerDistance(a, b, x, y);
           if (distanceA == ignore) {
               continue; 
               }
           if (distanceA < minDistance) { 
               minDistance = distanceA;
               table[2] = a;
               table[3] = b;
               } 
           }
    ignore2 = minDistance;

    for (i = 0; i < that.length; i += 2) {
           a = that[i];
           b = that[i+1]; 
           distanceA = calculerDistance(a, b, x, y);
           if ((distanceA == ignore) || (distanceA == ignore2)) {
               continue; 
               }
           if (distanceA < minDistance) { 
               minDistance = distanceA;
               table[2] = a;
               table[3] = b;
               } 
           }

    return table; 
    }

2 个答案:

答案 0 :(得分:1)

我不会说法语,所以我觉得很难读懂你的代码。但是,请考虑这样:

Tou有一个计算最接近用户条目的方法。现在,您需要创建该方法的副本,该副本允许您计算与用户条目的最近点,但不包括您已找到的点。这将让你找到第一个和第二个最近的点。然后做同样的事情来找到第三点,这次是排除你已经找到的两点。

您可以复制现有方法。它可能看起来像这样:

public static int plusProche (int x, int y, int[] coordonneesHabitations, int ignoreIndex) {
    double distanceA = 0.0; 
    int k = x;
    int z = y;
    int a = 0;
    int b = 0;
    int [] that = Arrays.copyOf(coordonneesHabitations, coordonneesHabitations.length); 
    int taille = that.length;
    int i = 0;
    double minDistance = Float.MAX_VALUE;
    int position = 0;

       for (i = 0; i < taille; i += 2) {

           //here we add the ability to skip the passed index
           if ((i / 2) == ignoreIndex) {
               continue;
           }

           a = that[i];
           b = that[i+1]; 
           distanceA = calculerDistance(a, b, k, z);
           if (distanceA < minDistance) { 
               minDistance = distanceA;
               position = i/2;
               System.out.println(i + " " + minDistance);
           }
       }
       return position;
}

您可以通过将最近点的索引作为参数传递来使用上述内容来查找第二个最近点。它将跳过该索引,从而找到下一个最接近的索引。做类似的事情找到第三个最接近的点。

答案 1 :(得分:0)

There's a solution that works, in case someone might need it...

public static int[] troisPlusProches (int x, int y, int[] coordonneesHabitations) 
{
    LinkedList<Integer> resultArray = new LinkedList<Integer>();
    int[] origArr = Arrays.copyOf(coordonneesHabitations, coordonneesHabitations.length);
    while (resultArray.size() < 6) {
        int positionInArray = Decharge.plusProche(x, y, origArr);
        LinkedList<Integer> newArr = new LinkedList<Integer>();
        for (int i = 0; i < origArr.length; i = i + 2) {
            if (i != positionInArray * 2) {
                newArr.add(origArr[i]);
                newArr.add(origArr[i + 1]);
            } else {
                resultArray.add(origArr[i]);
                resultArray.add(origArr[i + 1]);
            }
        }
        origArr = new int[newArr.size()];
        for (int k = 0; k < origArr.length; k++) {
            origArr[k] = newArr.get(k);
        }
    }
    int[] intResultArray = new int[resultArray.size()];
    for (int l = 0; l < intResultArray.length; l++) {
        intResultArray[l] = resultArray.get(l);
    }
    return intResultArray;