func Optimize(vol volume.Space16, n int) { var q, q2 []int vol.SetAllFilled(1, math.MaxUint16-3) vol.MapBoundary(func(node g3.Node) { if node[2] > 8 { vol.Set16(node, 1) q = append(q, Index(vol, node[0], node[1], node[2])) return } }) for len(q) > 0 { fmt.Fprintf(os.Stderr, "len(q): %d\n", len(q)) q, q2 = q2[:0], q for _, index := range q2 { x, y, z := Coord(vol, index) v := vol.Get16(g3.Node{x, y, z}) if v == 0 { panic(fmt.Sprintf("x: %d, y: %d, z: %d, v == 0", x, y, z)) } for k := 0; k < 6; k++ { x1 := x + n6dx[k] y1 := y + n6dy[k] z1 := z + n6dz[k] v1 := vol.Get16(g3.Node{x1, y1, z1}) if v1 > v+1 && int(v)+1 <= n { vol.Set16(g3.Node{x1, y1, z1}, v+1) q = append(q, Index(vol, x1, y1, z1)) } } } } vol.SetAllFilled(uint16(n+1), 0) return }