Java 通过查找邻域点连接点集合
我有一个swing应用程序,其中有图像上一些点的ArrayList。 现在我想连接这些点,这样每个点都连接到它最近的邻居 像这样: 所以我开始是这样的: Minuatiae.javaJava 通过查找邻域点连接点集合,java,graph,Java,Graph,我有一个swing应用程序,其中有图像上一些点的ArrayList。 现在我想连接这些点,这样每个点都连接到它最近的邻居 像这样: 所以我开始是这样的: Minuatiae.java public class Minutiae { private int x; private int y; public Minutiae(int x, int y){ this.x = x; this.y = y; } public int getX() {
public class Minutiae {
private int x;
private int y;
public Minutiae(int x, int y){
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
Manager.java
List<Minutiae> minuatiaePoints = new ArrayList<Minutiae>(minutiae);
for(int i = 0; i<minuatiaePoints.size(); i++){
Minutiae mPoint = minuatiaePoints.get(i);
Minutiae minPoint = minuatiaePoints.get((i+1) % minuatiaePoints.size());
int minXDistance = minPoint.getX()-mPoint.getX();
int minYDistance = minPoint.getY()-mPoint.getY();
double minDist = Math.hypot(minXDistance, minYDistance);
for(int j = 0; j < minuatiaePoints.size(); j++) // <- you had i++ here!
{
if (i == j) {
continue;
}
Minutiae testPt = minuatiaePoints.get(j);
double dist = Math.hypot(mPoint.getX() - testPt.getX(), mPoint.getY() - testPt.getY());
if (dist < minDist)
{
minDist = dist;
minPoint = testPt;
}
}
g2D.drawLine(mPoint.getX(), mPoint.getY(), minPoint.getX(), minPoint.getY());
}
列出细节点=新的ArrayList(细节点);
对于(int i=0;i您有两个选项:
一旦你有了最小距离,在你的列表上再做一次尝试,并连接所有最小距离=你的最小距离的人(因此你只需要找到最小距离)。在第二次跑步时,如果dist=最小距离,那么你每次都要划一条线
第二个选项是保留一个最小距离点列表,然后遍历该列表以绘制线
编辑:更新以添加第二个算法的代码:
List<Minutiae> minuatiaePoints = new ArrayList<Minutiae>(minutiae);
for(int i = 0; i<minuatiaePoints.size(); i++){
Minutiae mPoint = minuatiaePoints.get(i);
Minutiae minPoint = minuatiaePoints.get((i+1) % minuatiaePoints.size());
int minXDistance = minPoint.getX()-mPoint.getX();
int minYDistance = minPoint.getY()-mPoint.getY();
double minDist = Math.hypot(minXDistance, minYDistance);
List<Minutiae> minDistPoints = new ArrayList<Minutiae>();
for(int j = 0; j < minuatiaePoints.size(); j++) // <- you had i++ here!
{
if (i == j) {
continue;
}
Minutiae testPt = minuatiaePoints.get(j);
double dist = Math.hypot(mPoint.getX() - testPt.getX(), mPoint.getY() - testPt.getY());
if (dist < minDist)
{
minDist = dist;
minDistPoints = new ArrayList<Minutiae>();
minDistPoints.add(testPt);
} else if (dist = minDist) {
minDistPoints.add(testPt);
}
}
for(Minutae p: minDistPoints){
g2D.drawLine(mPoint.getX(), mPoint.getY(), p.getX(), p.getY());
}
}
列出细节点=新的ArrayList(细节点);
对于(int i=0;i您有两个选项:
一旦你有了最小距离,在你的列表上再做一次尝试,并连接所有最小距离=你的最小距离的人(因此你只需要找到最小距离)。在第二次跑步时,如果dist=最小距离,那么你每次都要划一条线
第二个选项是保留一个最小距离点列表,然后遍历该列表以绘制线
编辑:更新以添加第二个算法的代码:
List<Minutiae> minuatiaePoints = new ArrayList<Minutiae>(minutiae);
for(int i = 0; i<minuatiaePoints.size(); i++){
Minutiae mPoint = minuatiaePoints.get(i);
Minutiae minPoint = minuatiaePoints.get((i+1) % minuatiaePoints.size());
int minXDistance = minPoint.getX()-mPoint.getX();
int minYDistance = minPoint.getY()-mPoint.getY();
double minDist = Math.hypot(minXDistance, minYDistance);
List<Minutiae> minDistPoints = new ArrayList<Minutiae>();
for(int j = 0; j < minuatiaePoints.size(); j++) // <- you had i++ here!
{
if (i == j) {
continue;
}
Minutiae testPt = minuatiaePoints.get(j);
double dist = Math.hypot(mPoint.getX() - testPt.getX(), mPoint.getY() - testPt.getY());
if (dist < minDist)
{
minDist = dist;
minDistPoints = new ArrayList<Minutiae>();
minDistPoints.add(testPt);
} else if (dist = minDist) {
minDistPoints.add(testPt);
}
}
for(Minutae p: minDistPoints){
g2D.drawLine(mPoint.getX(), mPoint.getY(), p.getX(), p.getY());
}
}
列出细节点=新的ArrayList(细节点);
对于(int i=0;i我想问你在细节点中保存了什么:d你能详细说明你如何定义最近的邻居吗?例如,为什么6和5不相连?或者4和2不相连?@Gerret细节点是图像上具有x,y坐标的一些点。@Dukeling点是图形应该以这样的方式连接,而不需要c将每个点连接到每个其他点,但它应该连接到它的邻居。我猜这不是一个真正的图,其中距离是以到达节点所需的边数来测量的,而是一个图的空间表示,其中它是几何距离,测量节点之间的距离,可以通过所示代码推断出来。我可以问你吗细节点中保存的内容:D能否详细说明如何定义最近的邻居?例如,为什么不连接6和5?或者不连接4和2?@Gerret细节点是图像上具有x,y坐标的一些点。@Dukeling点是图形的连接方式,不需要将每个点连接到每个点另一点,但它应该连接到它的邻居。我猜这不是一个真正的图,距离是以到达一个节点所需的边的数量来测量的,而是一个图的空间表示,它是几何距离,测量节点之间的距离,这可以通过显示的代码推断出来。很抱歉,回复太晚了。是的..它是有效的ked但我的要求被更改了,我不得不将其暂停一段时间。我会尽快与您联系,我准备好与要求相同的工作。谢谢您的迟到回复。是的。它工作了,但我的要求被更改了,我不得不暂停一段时间。我会尽快与您联系,我准备与要求相同的工作谢谢