我会尝试解释我的问题:我正在使用3D环境,我有两个相邻的点(例如A:1,1,1和B:2,1,1)我需要一个方法找到与B相邻的所有8或6个点。我可以在纸上做到这一点但是我找不到在程序中执行此操作的方法,除非我手动逐点指定(非常烦人且很久以来它是18 * 8 + 8 * 6种不同的情况)。
我手工完成了计算,结果在我的例子中: 2,1,0; 2,2,0; 2,0,1; 2,0,2; 2,1,2; 2,2,1; 2,2,2; 2,0,0
另一个例子有A:1,1,1和B:2,2,1,结果如下: 2,1,1; 1,2,1; 2,1,2; 1,2,2; 2,1,0; 1,2,0; 2,2,2; 2,2,0
第三个是A:1,1,1和B 2,2,2: 2,2,1; 2,1,2; 1,2,2; 1,1,2; 1,2,1; 2,1,1
答案 0 :(得分:1)
我必须在二维地图上解决这些问题(但它在3d中是一样的)
public Point[] getNeigbours(Point from, Point to){
EForm form = determineForm(from, to);
if (form == EForm.formA){
Point n1 = new Point(from.x, from.y, from.z+1);
Point n2 = new Point(from.x, from.y, from.z-1);
//...and so on
Point nn = new Point(from.x-1, from.y-1, from.z-1);
Point[] retValue = new Point[]{n1, n2, ... nn};
return retValue;
}
if (form == EForm.formB){
Point n1 = // another rule applys for this form
Point[] retValue = new Point[]{n1, n2, ... nn};
return retValue;
}
}
private EForm determineForm(Point from, Point to){
int dx = to.x-from.x;
int dy = to.y-from.y;
int dz = to.x-from.z;
if (dx == 0 && dx == -1 && dz == 0){
return EForm.formA;
}
}
所以你先确定你的Point-Combination形式;这两点应该只有14种形式;
然后你必须手动检测每个表单的所有邻居;最后,如果你完全了解它们,你可以创建你的邻居(使用手动创建的解决方案);
EForm是一个Enum,包含14种可能的形式!
答案 1 :(得分:0)
public List<RPoint> TDNeighborsOnALine(RPoint endPoint){
List<RPoint> points = new ArrayList<>();
if (Geometry.distanceTwoPoints(this, endPoint) > 1){
int vx = Math.max(-1, Math.min(1, (endPoint.getX()-x)));
int vy = Math.max(-1, Math.min(1, (endPoint.getY()-y)));
int vz = Math.max(-1, Math.min(1, (endPoint.getZ()-z)));
RPoint b = new RPoint (x + vx, y + vy, z + vz);
RPoint c = new RPoint (x + (vx*2), y + (vy*2), z + (vz*2));
for (int ox = -1; ox < 2; ox++){
for (int oy = -1; oy < 2; oy ++){
for (int oz = -1; oz < 2; oz++){
RPoint p = new RPoint(ox + x, oy + y, oz + z);
double d = Geometry.distanceTwoPoints(c, p);
if (d < Geometry.distanceTwoPoints(c, this) && d <= 3){
points.add(p);
}
}
}
}
} else {
points.add(endPoint);
}
return points;
}
public static double distanceTwoPoints(RPoint a, RPoint b){
return Math.sqrt(Math.pow((a.getX() - b.getX()), 2) + Math.pow((a.getY() - b.getY()), 2) + Math.pow((a.getZ() - b.getZ()), 2));
}
这是我解决问题的方法。它的工作依赖于A的每个邻居与C的距离小于C的距离为A,其中C是B上A的镜像,是从A到C的路径上的一个点,每个邻居到与C的距离远远超过3的距离也不是路径上的一个方便点,因为它从C中移除的多于x,y,z。