2013-12-18 6 views
0

Я попытаюсь объяснить свою проблему: я работаю с трехмерной средой, у меня есть две смежные точки (например, A: 1,1,1 и B: 2,1,1), и мне нужен способ найти все 8 или 6 точек, которые находятся рядом с B. Я могу сделать это на бумаге, но я не могу найти способ сделать это в программе , если я не укажу его по пунктам вручную (довольно раздражает и долгое время это 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

Когда это 6 соседей? Кроме того, неясно, какова актуальность A здесь, можете ли вы нарисовать (2D) диаграмму? –

+0

Какова релевантность A, если вы пытаетесь найти все точки, которые являются соседями с B? – turbo

+0

Это 6 соседей, когда движение находится на всех трех осях. Я не могу сделать 2D-диаграмму, которая может включать A, но думаю, поскольку я пытаюсь проецировать пирамиду внутри куба, где центральной точкой в ​​базе является точка B, а вершина - точка A. –

ответ

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)); 
} 

Это мое решение проблемы. Это работает, полагаясь на то, что каждый сосед к А, который находится на меньшем расстоянии от C, чем C, является A, где C является зеркалом A на B, является точкой на пути от A до C, причем каждый сосед A, расстояние которого от C дальше 3, также не является удобной точкой на пути, поскольку оно удаляется больше, чем x, y, z из C.

+0

ОК, имея эту дополнительную информацию, которую вы можете пропустить соседей на определенном расстоянии, сделайте ту часть, где вы должны идентифицировать форма AB устарела - но я был уверен, что было бы много геометрии в этих 14 формах ^^ –

+0

эй - кстати! было очень интересно поговорить с вами, и я желаю вам удачи для вашей дальнейшей работы =) химии или молекулярной биологии или что это может быть ^^ –

+0

Ахах, моя степень в социологии, я пишу игровой движок как timewaster: D –

1

я должен был решить такие проблемы, на 2-й карте (но это так же в 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-комбинации; для этих двух точек должно быть только 14 возможных форм;

тогда вам нужно вручную определить всех соседей для каждой формы; наконец, если вы их знаете, вы можете создать своих соседей (используя созданные вручную решения);

EForm - это Enum, охватывающий эти 14 возможных форм!

+0

К сожалению, в 3D это не так просто, потому что возможностей слишком много, чтобы оценивать без очень сложной системы коммутаторов (и подверженных ошибкам).Я все равно отвечу вас за ответ. –

+0

вам нужно написать список «посещенных» соседей; добавьте точки, которые были посещены в этом списке. когда вы получите своих соседей, просто спросите, что соседка уже в этом списке. если его нет в списке, вы можете продолжить, иначе вы пропустите эту точку. –

+0

Вы предполагаете, что точки соседствуют с обеими точками, что, к сожалению, не так. –

Смежные вопросы