簡體   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