[英]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.