按最近点LibGDX Java排序点的数组列表

按最近点LibGDX Java排序点的数组列表,java,arraylist,libgdx,Java,Arraylist,Libgdx,我有一个Vector2的ArrayList(Vector2是一个包含x和y坐标的对象),其中包含一组顶点,这些顶点在绘制时形成一个形状。然而,将它们放入ArrayList的方式是不正常的。例如,起始矢量2点是索引0,但最近的下一点是索引4。我的目标是创建另一个向量2的ArrayList,它以某种方式对向量2进行排序,以便起点是索引0,下一个最近点是索引1,下一个是索引2,等等。下面是正在发生的事情的图像 图中显示了正在发生的事情,但绿色箭头显示了我希望发生的事情。绿点是起点。 因此,我需要的是

我有一个Vector2的ArrayList(Vector2是一个包含x和y坐标的对象),其中包含一组顶点,这些顶点在绘制时形成一个形状。然而,将它们放入ArrayList的方式是不正常的。例如,起始矢量2点是索引0,但最近的下一点是索引4。我的目标是创建另一个向量2的ArrayList,它以某种方式对向量2进行排序,以便起点是索引0,下一个最近点是索引1,下一个是索引2,等等。下面是正在发生的事情的图像

图中显示了正在发生的事情,但绿色箭头显示了我希望发生的事情。绿点是起点。

因此,我需要的是,一旦创建并排序了新的ArrayList,它应该如下所示:

下面是我认为可以实现的代码:

public Array<Vector2> orderedVertices;
private void cleanVertices(Array<Vector2> originalVertices){

    //This will be the Array containing ordered vertices
    orderedVertices = new Array<Vector2>();

    //Copy vertices of unsorted Array in a new Array
    Array<Vector2> verticesOfImage = originalVertices;


    //Add a random vertice to begin with (starting point)
    orderedVertices.add(verticesOfImage.get(1));

    //For breaking loop
    int originalArraySize = originalVertices.size;

    for(int i = 0; i < orderedVertices.size; i++){
        //Index to be compared, meaning to find closest vertice around this vertice
        int indexOfCompare = i;
        //Get a distance for reference                                                     //Random point to check
        double currentDistance = MathFactory.distance(orderedVertices.get(indexOfCompare), verticesOfImage.get(0));

        //If we found a closest vertice, add to ordered pair and remove from original
        // So we don't go backwards
        if(getClosest(verticesOfImage, indexOfCompare, currentDistance) != -1){
            orderedVertices.add(verticesOfImage.removeIndex(getClosest(verticesOfImage, indexOfCompare, currentDistance)));
        }
        //If not, then the original 'currentDistance' check was the closest vertice
        else
            orderedVertices.add(verticesOfImage.removeIndex(0));

        //Stop checks, ordered pair fully populated
        if(orderedVertices.size == originalArraySize)
            break;

    }

}

public int getClosest(Array<Vector2> vertices, int checkedIndex, double currentDistance){
    //This is used to find the closest vertice, defaulted to -1 for condition statements
    int correctIndex = -1;

    for(int k = 0; k < vertices.size; k++){
        //Make sure to not check same Vector2
        if(vertices.get(k).x == orderedVertices.get(checkedIndex).x && vertices.get(k).y == orderedVertices.get(checkedIndex).y){
            continue;
        }
        if(MathFactory.distance(orderedVertices.get(checkedIndex), vertices.get(k)) < currentDistance){
            correctIndex = k;
            currentDistance = MathFactory.distance(orderedVertices.get(checkedIndex), vertices.get(k));

        }

    }
    return correctIndex;
}
公共数组有序顶点;
私有顶点(数组原始属性){
//这将是包含有序顶点的数组
orderedVertices=新数组();
//在新阵列中复制未排序阵列的顶点
阵列垂直方向图像=原始垂直度;
//添加要开始的随机顶点(起点)
add(verticesOfImage.get(1));
//用于断环
int originalArraySize=originalVertices.size;
对于(int i=0;i
这段代码非常接近工作状态,下面是一幅解释出错原因的图片


我知道不起作用的那条看起来不那么平滑,但唯一真正的问题是,线条在末端会变形并穿过身体。我似乎不明白为什么会发生这种情况,也不知道如何解决。非常感谢您的帮助!谢谢大家!

我没有详细研究你的算法,但从你描述它的方式来看,结果与你预期的差不多。当找到最近的点时,某些点将被“跳过”。你需要一个不同的方法。你应该考虑这个算法并不总是有效的。在第一幅图像中,最右边的点可能会被跳过。可能存在歧义或跳过的要点。他们应该如何治疗?在生成的图像中,可以想象这发生在图形手部的白色小部分,导致出现最长的对角线。除此之外,仅仅通过查看代码就很难发现潜在的bug(例如,是否存在与您正在比较的“随机第一点”相关的bug,等等)。(编辑:是的,几秒钟太慢了…)这项任务相当于旅行推销员问题,这是NP难问题。虽然有各种各样的近似方法,这应该足够了。我没有详细研究你的算法,但从你描述它的方式来看,结果与你预期的差不多。当找到最近的点时,某些点将被“跳过”。你需要一个不同的方法。你应该考虑这个算法并不总是有效的。在第一幅图像中,最右边的点可能会被跳过。可能存在歧义或跳过的要点。他们应该如何治疗?在生成的图像中,可以想象这发生在图形手部的白色小部分,导致出现最长的对角线。除此之外,仅仅通过查看代码就很难发现潜在的bug(例如,是否存在与您正在比较的“随机第一点”相关的bug,等等)。(编辑:是的,几秒钟太慢了…)这项任务相当于旅行推销员问题,这是NP难问题。不过,有各种近似值,这应该足够了。