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