changeset 707:9db4ae29ded9 octree

octree: Moved octree traveral code to own file.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Fri, 21 Sep 2018 11:02:24 +0200
parents fe0889460e97
children fdd88e95bae7
files cmd/octree2contour/loader.go cmd/octree2contour/octree.go
diffstat 2 files changed, 81 insertions(+), 76 deletions(-) [+]
line wrap: on
line diff
--- a/cmd/octree2contour/loader.go	Fri Sep 21 09:50:46 2018 +0200
+++ b/cmd/octree2contour/loader.go	Fri Sep 21 11:02:24 2018 +0200
@@ -11,17 +11,6 @@
 	"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[:]
@@ -129,71 +118,6 @@
 	return tree, nil
 }
 
-func (ot *octree) horizontal(h float64, fn func(*triangle)) {
-
-	type frame struct {
-		pos int32
-		min float64
-		max float64
-	}
-
-	if h < ot.min.z || ot.max.z < h {
-		return
-	}
-
-	stack := []frame{{1, ot.min.z, ot.max.z}}
-
-	dupes := map[int32]struct{}{}
-
-	for len(stack) > 0 {
-		top := stack[len(stack)-1]
-		stack = stack[:len(stack)-1]
-
-		pos := top.pos
-		if pos == 0 {
-			continue
-		}
-		min, max := top.min, top.max
-
-		if pos > 0 { // node
-			if mid := (max-min)*0.5 + min; h >= mid {
-				pos += 4 // nodes with z-bit set
-				min = mid
-			} else {
-				max = mid
-			}
-			stack = append(stack,
-				frame{ot.index[pos+0], min, max},
-				frame{ot.index[pos+1], min, max},
-				frame{ot.index[pos+2], min, max},
-				frame{ot.index[pos+3], min, max})
-		} else { // leaf
-			pos = -pos - 1
-			n := ot.index[pos]
-			//log.Printf("%d %d %d\n", pos, n, len(ot.index))
-			indices := ot.index[pos+1 : pos+1+n]
-
-			for _, idx := range indices {
-				if _, found := dupes[idx]; found {
-					continue
-				}
-				tri := ot.triangles[idx]
-				t := triangle{
-					ot.vertices[tri[0]],
-					ot.vertices[tri[1]],
-					ot.vertices[tri[2]],
-				}
-
-				if !(math.Min(t[0].z, math.Min(t[1].z, t[2].z)) > h ||
-					math.Max(t[0].z, math.Max(t[1].z, t[2].z)) < h) {
-					dupes[idx] = struct{}{}
-					fn(&t)
-				}
-			}
-		}
-	}
-}
-
 func loadOctree(fname string) (*octree, error) {
 
 	f, err := os.Open(fname)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cmd/octree2contour/octree.go	Fri Sep 21 11:02:24 2018 +0200
@@ -0,0 +1,81 @@
+package main
+
+import (
+	"math"
+)
+
+type octree struct {
+	epsg uint32
+
+	vertices  []vertex
+	triangles [][]int32
+	index     []int32
+
+	min vertex
+	max vertex
+}
+
+func (ot *octree) horizontal(h float64, fn func(*triangle)) {
+
+	type frame struct {
+		pos int32
+		min float64
+		max float64
+	}
+
+	if h < ot.min.z || ot.max.z < h {
+		return
+	}
+
+	stack := []frame{{1, ot.min.z, ot.max.z}}
+
+	dupes := map[int32]struct{}{}
+
+	for len(stack) > 0 {
+		top := stack[len(stack)-1]
+		stack = stack[:len(stack)-1]
+
+		pos := top.pos
+		if pos == 0 {
+			continue
+		}
+		min, max := top.min, top.max
+
+		if pos > 0 { // node
+			if mid := (max-min)*0.5 + min; h >= mid {
+				pos += 4 // nodes with z-bit set
+				min = mid
+			} else {
+				max = mid
+			}
+			stack = append(stack,
+				frame{ot.index[pos+0], min, max},
+				frame{ot.index[pos+1], min, max},
+				frame{ot.index[pos+2], min, max},
+				frame{ot.index[pos+3], min, max})
+		} else { // leaf
+			pos = -pos - 1
+			n := ot.index[pos]
+			//log.Printf("%d %d %d\n", pos, n, len(ot.index))
+			indices := ot.index[pos+1 : pos+1+n]
+
+			for _, idx := range indices {
+				if _, found := dupes[idx]; found {
+					continue
+				}
+				tri := ot.triangles[idx]
+				t := triangle{
+					ot.vertices[tri[0]],
+					ot.vertices[tri[1]],
+					ot.vertices[tri[2]],
+				}
+
+				if !(math.Min(t[0].z, math.Min(t[1].z, t[2].z)) > h ||
+					math.Max(t[0].z, math.Max(t[1].z, t[2].z)) < h) {
+					dupes[idx] = struct{}{}
+					fn(&t)
+				}
+			}
+		}
+	}
+}