Mercurial > gemma
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 {