<p>如果要在三维扫描中枚举每个连续路径(从而获得每个路径的端点),可以对每个位置应用基本的深度优先搜索,例如:</p>
<pre><code>//applied at some voxel
dfs(...)
for each surrounding voxel
dfs(...)
</code></pre>
<p>或细节:</p>
<pre><code>class coordinate{
x
y
z
visited
}
initialize pathList
initialize coords
add all coordinates which contain "matter" to coords
dfs(coordinate,path)
coordinate.visited = TRUE
isEnd = TRUE
FOR each coordinate
//check each of the 26 possible locations (total 26 conditionals)
IF coordinate.get(x-1,y-1,z+1) IN coords AND
NOT coordinate.get(x-1,y-1,z+1).visited THEN
isEnd = FALSE
path += coordinate.get(x-1,y-1,z+1)
dfs(coordinate.get(x-1,y-1,z+1),path)
...
IF coordinate.get(x+1,y+1,z-1) IN coords AND
NOT coordinate.get(x+1,y+1,z-1).visited THEN
isEnd = FALSE
path += coordinate.get(x+1,y+1,z-1)
dfs(coordinate.get(x+1,y+1,z-1),path)
IF isEnd THEN
add path to pathList
remove coordinate from coords
WHILE coords isn't empty
dfs(coords.get(0),"")
</code></pre>
<p>通用过程(dfs)在许多其他站点上都有很好的文档记录,但是如果您想测试它,这里有一些粗糙的java(我对python不太熟悉)可以反映上面的内容:</p>
<pre class="lang-java prettyprint-override"><code>public class C {
ArrayList<Coordinate> coords = new ArrayList<>();
ArrayList<String> paths = new ArrayList<>();
static class Coordinate {
int x, y, z;
boolean visited;
Coordinate(int x,int y,int z){
this.x = x;
this.y = y;
this.z = z;
visited = false;
}
public String toString() {
return "("+x+","+y+","+z+")";
}
}
void dfs(Coordinate c,String path) {
c.visited=true;
path+=c.toString();
boolean isEnd = true;
//apply dfs to 26 possible neighbors
for(int x = c.x-1; x <= c.x+1; x++) {
for (int y = c.y-1; y <= c.y+1; y++) {
for (int z = c.z+1; z >= c.z-1; z ) {
Coordinate coord = getCoordinate(x,y,z);
//if coord exists and it's not been visited
if(coord!=null && !coord.visited && !coord.equals(c)) {
isEnd = false;
dfs(coord, path);
}
}
}
}
if(isEnd) paths.add(path);
coords.remove(c);
}
Coordinate getCoordinate(int x,int y,int z){
for(Coordinate b: coords){
if(x==b.x && y==b.y && z==b.z) return b;
}
return null;
}
void search(){
//while there are points in 3d space extend a path from one
while(!coords.isEmpty()){
dfs(coords.get(0),"");
}
}
public static void main(String[] args) {
C coord = new C();
//for each place where there exists matter
//create a coordinate object and add to coords
// for example:
coord.coords.add(new Coordinate(0,0,0));
coord.coords.add(new Coordinate(-1,1,1));
coord.coords.add(new Coordinate(1,1,1));
coord.coords.add(new Coordinate(-1,2,2));
coord.coords.add(new Coordinate(-1,0,2));
coord.coords.add(new Coordinate(1,2,2));
coord.coords.add(new Coordinate(1,0,2));
coord.search();
//print out each path on separate line,
//the path endings can easily be obtained from this
for(String s:coord.paths) System.out.println(s);
}
}
</code></pre>