Java 在给定两个不同的3D点的情况下,查找一组特定的相邻点(不是它们的全部)

Java 在给定两个不同的3D点的情况下,查找一组特定的相邻点(不是它们的全部),java,3d,Java,3d,我将尝试解释我的问题:我正在使用3D环境,我有两个相邻的点(例如a: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

我将尝试解释我的问题:我正在使用3D环境,我有两个相邻的点(例如a: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和b2,2,2:
2,2,1;2,1,2;1,2,2;1,1,2;1,2,1;2,1,1

我不得不在2d地图上解决这些问题(但在3d地图上也一样)

所以你首先要确定你的点组合的形式;这两点应该只有14种可能的形式

然后,您必须手动检测每个表单的所有邻居;最后,如果您都知道,您可以创建您的邻居(使用您手动创建的解决方案)

EForm是一个枚举,包含这14种可能的表单!

公共列表TDNeightorSonaline(RPoint endPoint){
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));
}
列表点=新的ArrayList(); if(几何体距离两点(此端点)>1){ intvx=Math.max(-1,Math.min(1,(endPoint.getX()-x)); intvy=Math.max(-1,Math.min(1,(endPoint.getY()-y)); intvz=Math.max(-1,Math.min(1,(endPoint.getZ()-z)); RPoint b=新的RPoint(x+vx,y+vy,z+vz); RPoint c=新的RPoint(x+(vx*2)、y+(vy*2)、z+(vz*2)); for(intox=-1;ox<2;ox++){ 对于(int-oy=-1;oy<2;oy++){ 对于(整数盎司=-1;盎司<2;盎司++){ RPoint p=新的RPoint(ox+x,oy+y,oz+z); 双d=几何距离两点(c,p);
如果(dfor(x-1..x+1){for(y-1..y+1){for(z-1..z+1){/*跳过您不想要的*/}}来完成
。至少在2D中可以看到。换句话说:点A是立方体的中心点,在一个轴上移动它会影响一个面的中心点,在两个轴上移动它会影响两个面之间的连接,在所有三个轴上移动它会影响一个角。我对立方体中相邻的点感兴趣(如不超过+1、+1、+1或-1、-1、-1)到B,考虑到A位于立方体上正投射的多面体的顶点。不幸的是,在3D上它不是那么简单,因为如果没有非常复杂的开关系统,可能性太多,无法评估(并且容易出错)。我仍然会投票支持你的回答。你必须写一份“拜访”邻居的列表;在该列表中添加已经拜访过的点。当你找到你的邻居时,只需询问该邻居已经在该列表中。如果该邻居不在列表中,你可以继续,否则你可以跳过该点。你假设这些点与这两个点相邻s、 不幸的是,事实并非如此。啊,好吧,我现在更明白了;如果A-B只是一维和二维的(A:1,1和B:2,1,1->仅x-dim变化)(A:1,1和B:2,2,1->仅x-y-dim变化)你有8个邻域;如果你有三个维度,你就有这6个邻域;对吗?好的,8x6个邻域,6x8个邻域-你必须描述14个表单,总共96个可能的邻域,哇,很多工作^^^^^但是一旦你有了它们,你可以从任何组合中得到任何邻域!好的,有了这些进一步的信息,你可以跳过邻域我们在一定距离的位置,使您必须识别A-B表格的部分过时了-但我确信,在这14个表格中会有很多几何图形^^^^嘿-顺便说一下!与您交谈非常有趣,我祝您今后的工作好运=)化学或分子生物学或其他什么我的学位是社会学,我正在写一个游戏引擎来浪费时间:D
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));
}