changeset 682:b17e3ce53285 octree

octree: simplified cube indexing.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Wed, 19 Sep 2018 20:55:02 +0200
parents a8d32a11b113
children a31dc9486bd8
files cmd/octree2contour/loader.go cmd/tin2octree/builder.go cmd/tin2octree/vertex.go
diffstat 3 files changed, 43 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/cmd/octree2contour/loader.go	Wed Sep 19 18:39:03 2018 +0200
+++ b/cmd/octree2contour/loader.go	Wed Sep 19 20:55:02 2018 +0200
@@ -158,19 +158,18 @@
 		}
 
 		if pos > 0 { // node
-			if mid := (max-min)*0.5 + min; h <= mid {
-				stack = append(stack,
-					frame{ot.index[pos+0], min, mid},
-					frame{ot.index[pos+1], min, mid},
-					frame{ot.index[pos+3], min, mid},
-					frame{ot.index[pos+5], min, mid})
+			var zbit int32
+			if mid := (max-min)*0.5 + min; h >= mid {
+				zbit = 4
+				min = mid
 			} else {
-				stack = append(stack,
-					frame{ot.index[pos+4], mid, max},
-					frame{ot.index[pos+5], mid, max},
-					frame{ot.index[pos+6], mid, max},
-					frame{ot.index[pos+7], mid, max})
+				max = mid
 			}
+			stack = append(stack,
+				frame{ot.index[pos+0+zbit], min, max},
+				frame{ot.index[pos+1+zbit], min, max},
+				frame{ot.index[pos+2+zbit], min, max},
+				frame{ot.index[pos+3+zbit], min, max})
 		} else { // leaf
 			pos = -pos - 1
 			n := ot.index[pos]
--- a/cmd/tin2octree/builder.go	Wed Sep 19 18:39:03 2018 +0200
+++ b/cmd/tin2octree/builder.go	Wed Sep 19 20:55:02 2018 +0200
@@ -14,14 +14,31 @@
 }
 
 var cubes = [8][2]vertex{
-	{{0.0, 0.0, 0.0}, {0.5, 0.5, 0.5}},
-	{{0.5, 0.0, 0.0}, {1.0, 0.5, 0.5}},
-	{{0.0, 0.0, 0.5}, {0.5, 0.5, 1.0}},
-	{{0.0, 0.5, 0.5}, {0.5, 1.0, 1.0}},
-	{{0.5, 0.0, 0.0}, {1.0, 0.5, 0.5}},
-	{{0.5, 0.5, 0.0}, {1.0, 1.0, 0.5}},
-	{{0.5, 0.0, 0.5}, {1.0, 0.5, 1.0}},
-	{{0.5, 0.5, 0.5}, {1.0, 1.0, 1.0}},
+	makeCube(0),
+	makeCube(1),
+	makeCube(2),
+	makeCube(3),
+	makeCube(4),
+	makeCube(5),
+	makeCube(6),
+	makeCube(7),
+}
+
+func makeCube(i int) [2]vertex {
+	var d vertex
+	if i&1 == 1 {
+		d.x = 0.5
+	}
+	if i&2 == 2 {
+		d.y = 0.5
+	}
+	if i&4 == 4 {
+		d.z = 0.5
+	}
+	return [2]vertex{
+		vertex{0.0, 0.0, 0.0}.add(d),
+		vertex{0.5, 0.5, 0.5}.add(d),
+	}
 }
 
 func (tb *treeBuilder) build() {
--- a/cmd/tin2octree/vertex.go	Wed Sep 19 18:39:03 2018 +0200
+++ b/cmd/tin2octree/vertex.go	Wed Sep 19 20:55:02 2018 +0200
@@ -38,6 +38,14 @@
 	}
 }
 
+func (v vertex) add(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 {