Mercurial > gemma
changeset 674:120a82bd9953 octree
octree: Added loading frame for contour generation.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Wed, 19 Sep 2018 13:26:30 +0200 |
parents | 9a0246ab3021 |
children | 1cb565d244cf |
files | cmd/octree2contour/loader.go cmd/octree2contour/main.go cmd/octree2contour/vertex.go cmd/tin2octree/builder.go |
diffstat | 4 files changed, 227 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cmd/octree2contour/loader.go Wed Sep 19 13:26:30 2018 +0200 @@ -0,0 +1,139 @@ +package main + +import ( + "bufio" + "encoding/binary" + "io" + "log" + "math" + "os" + + "github.com/golang/snappy" +) + +type octree struct { + epsg uint32 + + vertices []vertex + triangles [][]int32 + index []int32 + + min vertex + max vertex +} + +func (v *vertex) read(r io.Reader) error { + var buf [8]byte + b := buf[:] + if _, err := io.ReadFull(r, b); err != nil { + return nil + } + v.x = math.Float64frombits(binary.LittleEndian.Uint64(b)) + if _, err := io.ReadFull(r, b); err != nil { + return nil + } + v.y = math.Float64frombits(binary.LittleEndian.Uint64(b)) + if _, err := io.ReadFull(r, b); err != nil { + return nil + } + v.z = math.Float64frombits(binary.LittleEndian.Uint64(b)) + return nil +} + +type byteReader interface { + io.ByteReader + io.Reader +} + +func loadOctreeReader(r byteReader) (*octree, error) { + tree := new(octree) + + if err := binary.Read(r, binary.LittleEndian, &tree.epsg); err != nil { + return nil, err + } + + if err := tree.min.read(r); err != nil { + return nil, err + } + + if err := tree.max.read(r); err != nil { + return nil, err + } + + var numVertices uint32 + if err := binary.Read(r, binary.LittleEndian, &numVertices); err != nil { + return nil, err + } + + log.Printf("vertices: %d\n", numVertices) + + vertices := make([]vertex, numVertices) + tree.vertices = vertices + + for i := range vertices { + if err := vertices[i].read(r); err != nil { + return nil, err + } + } + + var numTriangles uint32 + if err := binary.Read(r, binary.LittleEndian, &numTriangles); err != nil { + return nil, err + } + + log.Printf("triangles: %d\n", numTriangles) + + indices := make([]int32, 3*numTriangles) + triangles := make([][]int32, numTriangles) + tree.triangles = triangles + + var last int32 + + for i := range triangles { + tri := indices[:3] + indices = indices[3:] + triangles[i] = tri + for j := range tri { + v, err := binary.ReadVarint(r) + if err != nil { + return nil, err + } + value := int32(v) + last + tri[j] = value + last = value + } + } + + var numNodes uint32 + if err := binary.Read(r, binary.LittleEndian, &numNodes); err != nil { + return nil, err + } + + log.Printf("num nodes: %d\n", numNodes) + + tree.index = make([]int32, numNodes) + entries := tree.index[1:] + + last = 0 + for i := range entries { + v, err := binary.ReadVarint(r) + if err != nil { + return nil, err + } + value := int32(v) + last + entries[i] = value + last = value + } + + return tree, nil +} + +func loadOctree(fname string) (*octree, error) { + + f, err := os.Open(fname) + if err != nil { + return nil, err + } + defer f.Close() + return loadOctreeReader(bufio.NewReader(snappy.NewReader(f))) +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cmd/octree2contour/main.go Wed Sep 19 13:26:30 2018 +0200 @@ -0,0 +1,33 @@ +package main + +import ( + "flag" + "log" + "time" +) + +var ( + one = flag.Bool("o", false, "create only a single contour") + step = flag.Float64("s", 0.5, "step with") + max = flag.Float64("m", 10, "max height from lowest poiint") +) + +func process(tree *octree) { + // TODO: Implement me! +} + +func main() { + flag.Parse() + + for _, fname := range flag.Args() { + log.Printf("processing %s\n", fname) + start := time.Now() + tree, err := loadOctree(fname) + if err != nil { + log.Printf("error: %v\n", err) + continue + } + log.Printf("loading took: %v\n", time.Since(start)) + process(tree) + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cmd/octree2contour/vertex.go Wed Sep 19 13:26:30 2018 +0200 @@ -0,0 +1,54 @@ +package main + +type vertex struct { + x float64 + y float64 + z float64 +} + +func (v *vertex) minimize(w vertex) { + if w.x < v.x { + v.x = w.x + } + if w.y < v.y { + v.y = w.y + } + if w.z < v.z { + v.z = w.z + } +} + +func (v *vertex) maximize(w vertex) { + if w.x > v.x { + v.x = w.x + } + if w.y > v.y { + v.y = w.y + } + if w.z > v.z { + v.z = w.z + } +} + +func (v vertex) sub(w vertex) vertex { + return vertex{ + v.x - w.x, + v.y - w.y, + v.z - w.z, + } +} + +func interpolate(v1, v2 vertex) func(vertex) vertex { + v2 = v2.sub(v1) + return func(s vertex) vertex { + return vertex{ + v2.x*s.x + v1.x, + v2.y*s.y + v1.y, + v2.z*s.z + v1.z, + } + } +} + +func (a vertex) less(b vertex) bool { + return a.x < b.x || a.y < b.y || a.z < b.z +}
--- a/cmd/tin2octree/builder.go Wed Sep 19 11:03:00 2018 +0200 +++ b/cmd/tin2octree/builder.go Wed Sep 19 13:26:30 2018 +0200 @@ -35,6 +35,7 @@ tb.buildRecursive(triangles, tb.t.min, tb.t.max, 0) tb.index[0] = int32(len(tb.index)) + log.Printf("num nodes: %d\n", tb.index[0]) log.Printf("nodes: %d leaves: %d index %d\n", tb.nodes, tb.leaves, tb.index[0])