【问题标题】:Connect collection of points by finding neighborhood points通过查找邻域点来连接点集合
【发布时间】:2013-08-26 22:05:32
【问题描述】:

我有一个摇摆应用程序,其中我有一个图像上一些点的 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());
        }

但它只连接到一个最近的点。

谁能帮我解决这个问题? 任何链接或示例代码将不胜感激。

【问题讨论】:

  • 请问您在 minuatiaePoints 中保存了什么:D
  • 您能详细说明您如何定义最近的邻居吗?例如,为什么 6 和 5 不连接?还是 4 和 2?
  • @Gerret 细节点是图像上具有 x,y 坐标的一些点。
  • @Dukeling 关键是图应该以这样的方式连接,即不需要将每个点连接到每个其他点,但应该连接到它的邻居。
  • 我猜这不是一个真正的图,其中距离是用到达节点所需的边数来衡量的,而是一个图的空间表示,它是几何距离,它尽可能地测量节点之间的距离由显示的代码推断。

标签: java graph


【解决方案1】:

你有两个选择:

一旦你有了最小距离,在你的列表中再去一次,连接所有最小距离=你的最小距离的人(因此你只需要找到最小距离)。而在第二次运行时,如果 dist=min 距离,那么每次相等时都画线。

第二种选择是保留一个最小距离点列表,然后通过列表绘制线条。

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

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());
        }
    }

【讨论】:

  • 抱歉回复晚了。是的..它有效,但我的要求发生了变化,我不得不搁置一段时间。我会尽快与您联系,我准备按照要求进行相同的工作。谢谢
猜你喜欢
  • 2014-05-09
  • 1970-01-01
  • 2022-01-25
  • 2015-03-04
  • 2020-07-30
  • 2012-10-11
  • 2021-07-21
  • 1970-01-01
  • 2014-04-30
相关资源
最近更新 更多