繁体   English   中英

将一个点连接到不同点之间的每个最近的两个点

[英]connect a point to each two closest point between different points

嗨,我正在用Java编写应用程序。 在我的应用程序中,我需要一种方法来将每个点连接到许多不同点之间的两个最接近点(从一个点到其两个最接近点绘制一条线)。 首先,我创建了此方法,以便将每个点连接到最接近的点:

  public void connectingPoints()
  {

      ArrayList<Point>  externals = new ArrayList<Point>();
      for(int i = 0; i<externals.size(); i++)
      {
          Point point = externals.get(i);
          Point minPoint = externals.get(i+1);
          int minXDistance = minPoint.x-point.x;
          int minYDistance = minPoint.y-point.y;

          for(int j = 1; j<externals.size();i++)
          {
              if((externals.get(j+1).x-point.x<minXDistance)&&(externals.get(j+1).y-point.y<minYDistance))
              {
                  minPoint = externals.get(j+1);
              }
          }
          getGraphics().drawLine(point.x, point.y, minPoint.x, minPoint.y);
          repaint();
      }
  }
}

但是这种方法根本不起作用。 为什么? 问题出在哪儿? 以及如何将一个点连接到它的2个最近点。

并不是真正检查点之间的距离。 使用勾股定理计算点之间的距离,然后选择最低和第二最低的结果。 将X值之间的距离平方,将Y值之间的距离平方相加,然后取平方根。

问题1:您不是在计算距离,而是在以X表示距离+以Y表示距离。

distance = sqrt( x^2 + y^2)

好消息是,出于比较目的,您可以删除平方根。 您不能删除“正方形x”和“正方形y”部分。 很重要。

问题2:您找到了最近的点两次,而不是最近的两个点。 这是一个可以解决问题的快速n肮脏算法,尽管它肯定还有改进的余地:

For each point
  calculate and store distances to all the other points
  // use a sorted map for the above.
  grab the closest two points and draw your lines.

请注意,这将引起大量的重新计算,因此还有改进的余地。

另请注意,这不会为您的所有点创建路径。

我认为您有几个问题。 看来您有一个这样的班级:

public class Point {
   public double x;
   public double y;
}

您可能应该在类中添加如下所示的方法:

public double distance(Point p) {
    return Math.hypot(this.x - p.x, this.y - p.y);
}

还有一个:

public Point getClosestPoint(List<Point> pts) {
    double minDistSoFar = Double.MAX_VALUE;
    Point rval = null;

    for (Point p : pts) {
        if (p.x == this.x && p.y == this.y) {
            continue;
        }

        double pDist = this.distance(p);
        if (pDist < minDistSoFar) {
            minDistSoFar = pDist;
            rval = p;
        }
    }
}

现在您的算法可以变成这样:

public void connectingPoints()
{
    ArrayList<Point>  externals = new ArrayList<Point>();
    for(Point p : externals) {
        Point minPoint = p.getClosestPoint(externals);
        getGraphics().drawLine(point.x, point.y, minPoint.x, minPoint.y);
        repaint();
    }
}

编辑:您最初的问题可能是您在检查j值的循环中索引“ i”。 另外,这里是通过简单(且可行)代码重写的重写。

public void connectingPoints()
{
    ArrayList<Point>  externals = new ArrayList<Point>();
    for(int i = 0; i<externals.size(); i++)
    {
        Point point = externals.get(i);
        Point minPoint = externals.get((i+1) % externals.size());
        int minXDistance = minPoint.x-point.x;
        int minYDistance = minPoint.y-point.y;
        double minDist = Math.hypot(minXDistance, minYDistance);

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

            Point testPt = externals.get(j);
            double dist = Math.hypot(point.x - testPt.x, point.y - testPt.y);
            if (dist < minDist)
            {
                minDist = dist;
                minPoint = testPt;
            }
        }
        getGraphics().drawLine(point.x, point.y, minPoint.x, minPoint.y);
        repaint();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM