Java 通过查找邻域点连接点集合

Java 通过查找邻域点连接点集合,java,graph,Java,Graph,我有一个swing应用程序,其中有图像上一些点的ArrayList。 现在我想连接这些点,这样每个点都连接到它最近的邻居 像这样: 所以我开始是这样的: Minuatiae.java public class Minutiae { private int x; private int y; public Minutiae(int x, int y){ this.x = x; this.y = y; } public int getX() {

我有一个swing应用程序,其中有图像上一些点的ArrayList。 现在我想连接这些点,这样每个点都连接到它最近的邻居

像这样:

所以我开始是这样的:

Minuatiae.java

public class Minutiae {
  private int x;

  private int y;

  public Minutiae(int x, int y){
      this.x = x;
      this.y = y;
  }

 public int getX() {
     return x;
 }

 public void setX(int x) {
     this.x = x;
 }

 public int getY() {
     return y;
 }

 public void setY(int y) {
     this.y = y;
 }
}
Manager.java

List<Minutiae> minuatiaePoints = new ArrayList<Minutiae>(minutiae);

        for(int i = 0; i<minuatiaePoints.size(); i++){
            Minutiae mPoint = minuatiaePoints.get(i);
            Minutiae minPoint = minuatiaePoints.get((i+1) % minuatiaePoints.size());
            int minXDistance = minPoint.getX()-mPoint.getX();
            int minYDistance = minPoint.getY()-mPoint.getY();
            double minDist = Math.hypot(minXDistance, minYDistance);

            for(int j = 0; j < minuatiaePoints.size(); j++)  // <- you had i++ here!
            {
                if (i == j) {
                    continue;
                }

                Minutiae testPt = minuatiaePoints.get(j);
                double dist = Math.hypot(mPoint.getX() - testPt.getX(), mPoint.getY() - testPt.getY());
                if (dist < minDist)
                {
                    minDist = dist;
                    minPoint = testPt;
                }
            }
            g2D.drawLine(mPoint.getX(), mPoint.getY(), minPoint.getX(), minPoint.getY());
        }
列出细节点=新的ArrayList(细节点);
对于(int i=0;i您有两个选项:

一旦你有了最小距离,在你的列表上再做一次尝试,并连接所有最小距离=你的最小距离的人(因此你只需要找到最小距离)。在第二次跑步时,如果dist=最小距离,那么你每次都要划一条线

第二个选项是保留一个最小距离点列表,然后遍历该列表以绘制线

编辑:更新以添加第二个算法的代码:

List<Minutiae> minuatiaePoints = new ArrayList<Minutiae>(minutiae);

    for(int i = 0; i<minuatiaePoints.size(); i++){
        Minutiae mPoint = minuatiaePoints.get(i);
        Minutiae minPoint = minuatiaePoints.get((i+1) % minuatiaePoints.size());
        int minXDistance = minPoint.getX()-mPoint.getX();
        int minYDistance = minPoint.getY()-mPoint.getY();
        double minDist = Math.hypot(minXDistance, minYDistance);

        List<Minutiae> minDistPoints = new ArrayList<Minutiae>();

        for(int j = 0; j < minuatiaePoints.size(); j++)  // <- you had i++ here!
        {
            if (i == j) {
                continue;
            }

            Minutiae testPt = minuatiaePoints.get(j);
            double dist = Math.hypot(mPoint.getX() - testPt.getX(), mPoint.getY() - testPt.getY());
            if (dist < minDist)
            {
                minDist = dist;
                minDistPoints  = new ArrayList<Minutiae>();
                minDistPoints.add(testPt);
            } else if (dist = minDist) {
                minDistPoints.add(testPt);
            }
        }

        for(Minutae p: minDistPoints){
            g2D.drawLine(mPoint.getX(), mPoint.getY(), p.getX(), p.getY());
        }
    }
列出细节点=新的ArrayList(细节点);
对于(int i=0;i您有两个选项:

一旦你有了最小距离,在你的列表上再做一次尝试,并连接所有最小距离=你的最小距离的人(因此你只需要找到最小距离)。在第二次跑步时,如果dist=最小距离,那么你每次都要划一条线

第二个选项是保留一个最小距离点列表,然后遍历该列表以绘制线

编辑:更新以添加第二个算法的代码:

List<Minutiae> minuatiaePoints = new ArrayList<Minutiae>(minutiae);

    for(int i = 0; i<minuatiaePoints.size(); i++){
        Minutiae mPoint = minuatiaePoints.get(i);
        Minutiae minPoint = minuatiaePoints.get((i+1) % minuatiaePoints.size());
        int minXDistance = minPoint.getX()-mPoint.getX();
        int minYDistance = minPoint.getY()-mPoint.getY();
        double minDist = Math.hypot(minXDistance, minYDistance);

        List<Minutiae> minDistPoints = new ArrayList<Minutiae>();

        for(int j = 0; j < minuatiaePoints.size(); j++)  // <- you had i++ here!
        {
            if (i == j) {
                continue;
            }

            Minutiae testPt = minuatiaePoints.get(j);
            double dist = Math.hypot(mPoint.getX() - testPt.getX(), mPoint.getY() - testPt.getY());
            if (dist < minDist)
            {
                minDist = dist;
                minDistPoints  = new ArrayList<Minutiae>();
                minDistPoints.add(testPt);
            } else if (dist = minDist) {
                minDistPoints.add(testPt);
            }
        }

        for(Minutae p: minDistPoints){
            g2D.drawLine(mPoint.getX(), mPoint.getY(), p.getX(), p.getY());
        }
    }
列出细节点=新的ArrayList(细节点);

对于(int i=0;i我想问你在细节点中保存了什么:d你能详细说明你如何定义最近的邻居吗?例如,为什么6和5不相连?或者4和2不相连?@Gerret细节点是图像上具有x,y坐标的一些点。@Dukeling点是图形应该以这样的方式连接,而不需要c将每个点连接到每个其他点,但它应该连接到它的邻居。我猜这不是一个真正的图,其中距离是以到达节点所需的边数来测量的,而是一个图的空间表示,其中它是几何距离,测量节点之间的距离,可以通过所示代码推断出来。我可以问你吗细节点中保存的内容:D能否详细说明如何定义最近的邻居?例如,为什么不连接6和5?或者不连接4和2?@Gerret细节点是图像上具有x,y坐标的一些点。@Dukeling点是图形的连接方式,不需要将每个点连接到每个点另一点,但它应该连接到它的邻居。我猜这不是一个真正的图,距离是以到达一个节点所需的边的数量来测量的,而是一个图的空间表示,它是几何距离,测量节点之间的距离,这可以通过显示的代码推断出来。很抱歉,回复太晚了。是的..它是有效的ked但我的要求被更改了,我不得不将其暂停一段时间。我会尽快与您联系,我准备好与要求相同的工作。谢谢您的迟到回复。是的。它工作了,但我的要求被更改了,我不得不暂停一段时间。我会尽快与您联系,我准备与要求相同的工作谢谢