Я думаю, у вас есть несколько проблем. Похоже, у вас есть такой класс:
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();
}
}
РЕДАКТИРОВАТЬ: Ваша первоначальная проблема, вероятно, заключается в том, что вы индексируете «i» в своем цикле, исследуя значение 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();
}
}