给出两个不同的3D点,找到一组特定的相邻点(不是整个点)

时间:2013-12-18 16:29:49

标签: java 3d

我会尝试解释我的问题:我正在使用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

2 个答案:

答案 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。