changeset 729:b0bd242ff821

Removed vertex duplicate.
author Sascha L. Teichmann <teichmann@intevation.de>
date Sat, 22 Sep 2018 22:14:31 +0200
parents e9d37300ce99
children 4c05bdbf8e4b
files cmd/tin2octree/builder.go cmd/tin2octree/tin.go cmd/tin2octree/vertex.go pkg/octree/loader.go pkg/octree/vertex.go
diffstat 5 files changed, 56 insertions(+), 111 deletions(-) [+]
line wrap: on
line diff
--- a/cmd/tin2octree/builder.go	Sat Sep 22 21:58:15 2018 +0200
+++ b/cmd/tin2octree/builder.go	Sat Sep 22 22:14:31 2018 +0200
@@ -4,6 +4,8 @@
 	"encoding/binary"
 	"io"
 	"log"
+
+	"gemma.intevation.de/gemma/pkg/octree"
 )
 
 type treeBuilder struct {
@@ -13,7 +15,7 @@
 	index  []int32
 }
 
-var cubes = [8][2]vertex{
+var cubes = [8][2]octree.Vertex{
 	makeCube(0),
 	makeCube(1),
 	makeCube(2),
@@ -24,20 +26,20 @@
 	makeCube(7),
 }
 
-func makeCube(i int) [2]vertex {
-	var d vertex
+func makeCube(i int) [2]octree.Vertex {
+	var d octree.Vertex
 	if i&1 == 1 {
-		d.x = 0.5
+		d.X = 0.5
 	}
 	if i&2 == 2 {
-		d.y = 0.5
+		d.Y = 0.5
 	}
 	if i&4 == 4 {
-		d.z = 0.5
+		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),
+	return [2]octree.Vertex{
+		octree.Vertex{0.0, 0.0, 0.0}.Add(d),
+		octree.Vertex{0.5, 0.5, 0.5}.Add(d),
 	}
 }
 
@@ -60,7 +62,7 @@
 
 func (tb *treeBuilder) buildRecursive(
 	triangles []int32,
-	min, max vertex,
+	min, max octree.Vertex,
 	depth int,
 ) int32 {
 	if len(triangles) <= 16 || depth > 8 {
@@ -77,12 +79,12 @@
 		0, 0, 0, 0,
 		0, 0, 0, 0)
 
-	bbox := interpolate(min, max)
+	bbox := octree.Interpolate(min, max)
 
-	bboxes := make([][2]vertex, len(cubes))
+	bboxes := make([][2]octree.Vertex, len(cubes))
 
 	for i := range cubes {
-		bboxes[i] = [2]vertex{
+		bboxes[i] = [2]octree.Vertex{
 			bbox(cubes[i][0]),
 			bbox(cubes[i][1]),
 		}
@@ -97,15 +99,15 @@
 		v2 := tb.t.vertices[triangle[2]]
 
 		l := v0
-		l.minimize(v1)
-		l.minimize(v2)
+		l.Minimize(v1)
+		l.Minimize(v2)
 
 		h := v0
-		h.maximize(v1)
-		h.maximize(v2)
+		h.Maximize(v1)
+		h.Maximize(v2)
 
 		for i := range bboxes {
-			if !(h.less(bboxes[i][0]) || bboxes[i][1].less(l)) {
+			if !(h.Less(bboxes[i][0]) || bboxes[i][1].Less(l)) {
 				quandrants[i] = append(quandrants[i], tri)
 			}
 		}
--- a/cmd/tin2octree/tin.go	Sat Sep 22 21:58:15 2018 +0200
+++ b/cmd/tin2octree/tin.go	Sat Sep 22 22:14:31 2018 +0200
@@ -8,6 +8,8 @@
 	"io"
 	"log"
 	"math"
+
+	"gemma.intevation.de/gemma/pkg/octree"
 )
 
 var (
@@ -26,11 +28,11 @@
 
 type tin struct {
 	epsg      uint32
-	vertices  []vertex
+	vertices  []octree.Vertex
 	triangles [][]int32
 
-	min vertex
-	max vertex
+	min octree.Vertex
+	max octree.Vertex
 }
 
 func (t *tin) FromWKB(data []byte) error {
@@ -68,11 +70,11 @@
 		return err
 	}
 
-	vertices := make([]vertex, 0, 100000)
+	vertices := make([]octree.Vertex, 0, 100000)
 
-	var v vertex
+	var v octree.Vertex
 
-	v2i := make(map[vertex]int32, 100000)
+	v2i := make(map[octree.Vertex]int32, 100000)
 
 	var indexPool []int32
 
@@ -87,8 +89,8 @@
 
 	var triangles [][]int32
 
-	min := vertex{math.MaxFloat64, math.MaxFloat64, math.MaxFloat64}
-	max := vertex{-math.MaxFloat64, -math.MaxFloat64, -math.MaxFloat64}
+	min := octree.Vertex{math.MaxFloat64, math.MaxFloat64, math.MaxFloat64}
+	max := octree.Vertex{-math.MaxFloat64, -math.MaxFloat64, -math.MaxFloat64}
 
 	for i := uint32(0); i < num; i++ {
 
@@ -141,16 +143,16 @@
 				}
 				// Do this conversion later to spare reflect calls
 				// and allocs in binary.Read.
-				v.x = math.Float64frombits(x)
-				v.y = math.Float64frombits(y)
-				v.z = math.Float64frombits(z)
+				v.X = math.Float64frombits(x)
+				v.Y = math.Float64frombits(y)
+				v.Z = math.Float64frombits(z)
 				idx, found := v2i[v]
 				if !found {
 					idx = int32(len(vertices))
 					v2i[v] = idx
 					vertices = append(vertices, v)
-					min.minimize(v)
-					max.maximize(v)
+					min.Minimize(v)
+					max.Maximize(v)
 				}
 				triangle[p] = idx
 			}
@@ -159,7 +161,7 @@
 	}
 
 	log.Printf("bbox: [[%f, %f], [%f, %f]]\n",
-		min.x, min.y, max.x, max.y)
+		min.X, min.Y, max.X, max.Y)
 
 	*t = tin{
 		epsg:      wgs84,
@@ -181,26 +183,16 @@
 	return t.FromWKB(data)
 }
 
-func (v *vertex) write(w io.Writer) error {
-	for _, addr := range []*float64{&v.x, &v.y, &v.z} {
-		if err := binary.Write(
-			w, binary.LittleEndian, math.Float64bits(*addr)); err != nil {
-			return err
-		}
-	}
-	return nil
-}
-
 func (t *tin) Serialize(w io.Writer) error {
 
 	if err := binary.Write(w, binary.LittleEndian, t.epsg); err != nil {
 		return err
 	}
 
-	if err := t.min.write(w); err != nil {
+	if err := t.min.Write(w); err != nil {
 		return err
 	}
-	if err := t.max.write(w); err != nil {
+	if err := t.max.Write(w); err != nil {
 		return err
 	}
 
@@ -210,7 +202,7 @@
 	}
 
 	for _, v := range t.vertices {
-		if err := v.write(w); err != nil {
+		if err := v.Write(w); err != nil {
 			return err
 		}
 	}
--- a/cmd/tin2octree/vertex.go	Sat Sep 22 21:58:15 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-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 (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 {
-		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/pkg/octree/loader.go	Sat Sep 22 21:58:15 2018 +0200
+++ b/pkg/octree/loader.go	Sat Sep 22 22:14:31 2018 +0200
@@ -19,11 +19,11 @@
 
 	log.Printf("EPSG: %d\n", tree.EPSG)
 
-	if err := tree.Min.read(r); err != nil {
+	if err := tree.Min.Read(r); err != nil {
 		return nil, err
 	}
 
-	if err := tree.Max.read(r); err != nil {
+	if err := tree.Max.Read(r); err != nil {
 		return nil, err
 	}
 
@@ -42,7 +42,7 @@
 	tree.vertices = vertices
 
 	for i := range vertices {
-		if err := vertices[i].read(r); err != nil {
+		if err := vertices[i].Read(r); err != nil {
 			return nil, err
 		}
 	}
--- a/pkg/octree/vertex.go	Sat Sep 22 21:58:15 2018 +0200
+++ b/pkg/octree/vertex.go	Sat Sep 22 22:14:31 2018 +0200
@@ -154,7 +154,20 @@
 	return points
 }
 
-func (v *Vertex) read(r io.Reader) error {
+func (v *Vertex) Write(w io.Writer) error {
+	if err := binary.Write(
+		w, binary.LittleEndian, math.Float64bits(v.X)); err != nil {
+		return err
+	}
+	if err := binary.Write(
+		w, binary.LittleEndian, math.Float64bits(v.Y)); err != nil {
+		return err
+	}
+	return binary.Write(
+		w, binary.LittleEndian, math.Float64bits(v.Z))
+}
+
+func (v *Vertex) Read(r io.Reader) error {
 	var buf [8]byte
 	b := buf[:]
 	if _, err := io.ReadFull(r, b); err != nil {