2010-11-22 54 views
0

嗨我正在用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个最近点。

+1

当你说“不工作”时,它会做什么? – DJClayworth 2010-11-22 17:59:50

+0

我甚至都不明白这个问题。 – 2010-11-22 18:06:01

+1

它看起来像你增加我,当你应该在你的嵌套循环中增加j – 2010-11-22 21:36:07

回答

1

我认为你有几个问题。它看起来像你有一个这样的类:

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的值时编制“我”。此外,这里是一个简单的(可行的)重写你的代码的重写。

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

这并不真正检查点之间的距离。使用毕达哥拉斯定理计算点之间的距离,然后选择最低和最低的结果。平方X值之间的距离,添加Y值之间的距离的平方,然后取平方根。

1

问题1:你不是计算距离,你在计算X +的距离距离Y.

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

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

问题2:您找到两次最近的点,而不是最近的两个点。这里有一个快速正肮脏的算法会工作,但它肯定还有改进的余地:

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. 

注意,这将导致相当多的重新计算,因此改善的余地。

另请注意,这不会创建一个通过所有点的路径。