func Write(w io.Writer, vol volume.Space16, grid g3.Grid) (err error) { vol.MapBoundary(func(node g3.Node) { nv := volume.Normal(vol, node) cur := grid.At(node) if _, err = fmt.Fprintf(w, "%f %f %f %f %f %f\n", cur[0], cur[1], cur[2], nv[0], nv[1], nv[2]); err != nil { return } }) return }
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 }