Exemple #1
0
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
}