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])