Mercurial > gemma
annotate pkg/mesh/meshserialize_v2.go @ 5695:ef80748ae4f3 sr-v2
Finish deserializing v2 of the mesh index.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 12 Feb 2024 21:23:55 +0100 |
parents | d920f0fa2f04 |
children | 45240edad249 |
rev | line source |
---|---|
5680
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
1 // This is Free Software under GNU Affero General Public License v >= 3.0 |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
2 // without warranty, see README.md and license for details. |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
3 // |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
4 // SPDX-License-Identifier: AGPL-3.0-or-later |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
5 // License-Filename: LICENSES/AGPL-3.0.txt |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
6 // |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
7 // Copyright (C) 2024 by via donau |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
8 // – Österreichische Wasserstraßen-Gesellschaft mbH |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
9 // Software engineering by Intevation GmbH |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
10 // |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
11 // Author(s): |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de> |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
13 |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
14 package mesh |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
15 |
5684
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
16 import ( |
5686
c33a5354328d
Add stubs for de/serialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5685
diff
changeset
|
17 "bufio" |
5684
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
18 "cmp" |
5687
8ff842858434
More stubs for serializing v2.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5686
diff
changeset
|
19 "encoding/binary" |
5686
c33a5354328d
Add stubs for de/serialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5685
diff
changeset
|
20 "io" |
5684
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
21 "math" |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
22 "slices" |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
23 "sort" |
5688
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
24 |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
25 "gemma.intevation.de/gemma/pkg/common" |
5684
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
26 ) |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
27 |
5688
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
28 const quantScale = 1_000 |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
29 |
5690
da9720b4aa42
More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5689
diff
changeset
|
30 func quant(x float64) int64 { return int64(math.Round(x * quantScale)) } |
da9720b4aa42
More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5689
diff
changeset
|
31 func unquant(x int64) float64 { return float64(x) / quantScale } |
5688
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
32 |
5686
c33a5354328d
Add stubs for de/serialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5685
diff
changeset
|
33 func (s *STRTree) serializeV2(w io.Writer) error { |
5692
d920f0fa2f04
User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5691
diff
changeset
|
34 return serializer(w, s, |
d920f0fa2f04
User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5691
diff
changeset
|
35 serializeHeader(), |
d920f0fa2f04
User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5691
diff
changeset
|
36 serializeVersion(2), |
d920f0fa2f04
User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5691
diff
changeset
|
37 (*STRTree).serializeTinV2, |
d920f0fa2f04
User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5691
diff
changeset
|
38 (*STRTree).serializeEntries, |
d920f0fa2f04
User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5691
diff
changeset
|
39 (*STRTree).serializeIndexV2, |
d920f0fa2f04
User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5691
diff
changeset
|
40 (*STRTree).serializeBBoxesV2, |
d920f0fa2f04
User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5691
diff
changeset
|
41 ) |
d920f0fa2f04
User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5691
diff
changeset
|
42 } |
5690
da9720b4aa42
More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5689
diff
changeset
|
43 |
5692
d920f0fa2f04
User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5691
diff
changeset
|
44 func (s *STRTree) serializeTinV2(w io.Writer) error { |
d920f0fa2f04
User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5691
diff
changeset
|
45 return s.tin.serializeV2(w) |
5687
8ff842858434
More stubs for serializing v2.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5686
diff
changeset
|
46 } |
8ff842858434
More stubs for serializing v2.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5686
diff
changeset
|
47 |
8ff842858434
More stubs for serializing v2.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5686
diff
changeset
|
48 func (t *Tin) serializeV2(w io.Writer) error { |
5692
d920f0fa2f04
User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5691
diff
changeset
|
49 return serializer(w, t, |
d920f0fa2f04
User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5691
diff
changeset
|
50 (*Tin).serializeEPSG, |
d920f0fa2f04
User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5691
diff
changeset
|
51 (*Tin).serializeExtent, |
d920f0fa2f04
User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5691
diff
changeset
|
52 (*Tin).serializeVerticesV2, |
d920f0fa2f04
User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5691
diff
changeset
|
53 (*Tin).serializeTrianglesV2, |
d920f0fa2f04
User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5691
diff
changeset
|
54 ) |
5688
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
55 } |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
56 |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
57 func zigZag(buf []byte, w io.Writer, x int64) error { |
5689
159291854063
Simplify zug zig store call.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5688
diff
changeset
|
58 _, err := w.Write(buf[:binary.PutVarint(buf, x)]) |
159291854063
Simplify zug zig store call.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5688
diff
changeset
|
59 return err |
5688
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
60 } |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
61 |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
62 func (t *Tin) serializeVerticesV2(w io.Writer) error { |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
63 vertices := t.Vertices |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
64 if err := binary.Write(w, binary.LittleEndian, uint32(len(vertices))); err != nil { |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
65 return err |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
66 } |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
67 m := t.Min |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
68 buf := make([]byte, binary.MaxVarintLen64) |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
69 for dim := range 3 { |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
70 delta := common.Delta() |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
71 for i := range vertices { |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
72 var v float64 |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
73 switch dim { |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
74 case 0: |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
75 v = vertices[i].X - m.X |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
76 case 1: |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
77 v = vertices[i].Y - m.Y |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
78 case 2: |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
79 v = vertices[i].Z - m.Z |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
80 } |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
81 q := quant(v) |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
82 d := delta(q) |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
83 if err := zigZag(buf, w, d); err != nil { |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
84 return err |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
85 } |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
86 } |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
87 } |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
88 return nil |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
89 } |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
90 |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
91 func (t *Tin) serializeTrianglesV2(w io.Writer) error { |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
92 triangles := t.Triangles |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
93 if err := binary.Write(w, binary.LittleEndian, uint32(len(triangles))); err != nil { |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
94 return err |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
95 } |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
96 buf := make([]byte, binary.MaxVarintLen64) |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
97 delta := common.Delta() |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
98 for _, tri := range triangles { |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
99 for _, idx := range tri { |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
100 d := delta(int64(idx)) |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
101 if err := zigZag(buf, w, d); err != nil { |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
102 return err |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
103 } |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
104 } |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
105 } |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
106 return nil |
5687
8ff842858434
More stubs for serializing v2.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5686
diff
changeset
|
107 } |
8ff842858434
More stubs for serializing v2.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5686
diff
changeset
|
108 |
8ff842858434
More stubs for serializing v2.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5686
diff
changeset
|
109 func (s *STRTree) serializeIndexV2(w io.Writer) error { |
5688
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
110 index := s.index |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
111 if err := binary.Write(w, binary.LittleEndian, uint32(len(index))); err != nil { |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
112 return err |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
113 } |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
114 buf := make([]byte, binary.MaxVarintLen64) |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
115 delta := common.Delta() |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
116 for _, idx := range index { |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
117 d := delta(int64(idx)) |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
118 if err := zigZag(buf, w, d); err != nil { |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
119 return err |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
120 } |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
121 } |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
122 return nil |
5687
8ff842858434
More stubs for serializing v2.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5686
diff
changeset
|
123 } |
8ff842858434
More stubs for serializing v2.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5686
diff
changeset
|
124 |
8ff842858434
More stubs for serializing v2.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5686
diff
changeset
|
125 func (s *STRTree) serializeBBoxesV2(w io.Writer) error { |
5688
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
126 boxes := s.bboxes |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
127 if err := binary.Write(w, binary.LittleEndian, uint32(len(boxes))); err != nil { |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
128 return err |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
129 } |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
130 var ( |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
131 m = s.Min() |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
132 x1 = func(b Box2D) int64 { return quant(b.X1 - m.X) } |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
133 y1 = func(b Box2D) int64 { return quant(b.Y1 - m.Y) } |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
134 width = func(b Box2D) int64 { return quant(b.X2 - b.X1) } |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
135 height = func(b Box2D) int64 { return quant(b.Y2 - b.Y1) } |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
136 buf = make([]byte, binary.MaxVarintLen64) |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
137 ) |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
138 for _, proj := range []func(Box2D) int64{x1, y1, width, height} { |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
139 delta := common.Delta() |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
140 for _, b := range boxes { |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
141 v := delta(proj(b)) |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
142 if err := zigZag(buf, w, v); err != nil { |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
143 return err |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
144 } |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
145 } |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
146 } |
6281c18b109f
Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5687
diff
changeset
|
147 return nil |
5686
c33a5354328d
Add stubs for de/serialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5685
diff
changeset
|
148 } |
c33a5354328d
Add stubs for de/serialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5685
diff
changeset
|
149 |
c33a5354328d
Add stubs for de/serialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5685
diff
changeset
|
150 func (s *STRTree) deserializeV2(r *bufio.Reader) error { |
5690
da9720b4aa42
More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5689
diff
changeset
|
151 // The header is already skipped here. |
5692
d920f0fa2f04
User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5691
diff
changeset
|
152 return serializer(r, s, |
5691
9d2e74225104
Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5690
diff
changeset
|
153 (*STRTree).deserializeTinV2, |
9d2e74225104
Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5690
diff
changeset
|
154 (*STRTree).deserializeEntries, |
9d2e74225104
Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5690
diff
changeset
|
155 (*STRTree).deserializeIndexV2, |
9d2e74225104
Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5690
diff
changeset
|
156 (*STRTree).deserializeBBoxesV2, |
9d2e74225104
Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5690
diff
changeset
|
157 ) |
9d2e74225104
Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5690
diff
changeset
|
158 } |
9d2e74225104
Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5690
diff
changeset
|
159 |
9d2e74225104
Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5690
diff
changeset
|
160 func (s *STRTree) deserializeTinV2(r *bufio.Reader) error { |
5690
da9720b4aa42
More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5689
diff
changeset
|
161 s.tin = new(Tin) |
5691
9d2e74225104
Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5690
diff
changeset
|
162 return s.tin.deserializeV2(r) |
5690
da9720b4aa42
More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5689
diff
changeset
|
163 } |
da9720b4aa42
More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5689
diff
changeset
|
164 |
da9720b4aa42
More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5689
diff
changeset
|
165 func (s *STRTree) deserializeBBoxesV2(r *bufio.Reader) error { |
5695
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
166 var numBoxes uint32 |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
167 if err := binary.Read(r, binary.LittleEndian, &numBoxes); err != nil { |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
168 return err |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
169 } |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
170 boxes := make([]Box2D, numBoxes) |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
171 s.bboxes = boxes |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
172 var ( |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
173 m = s.Min() |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
174 x1 = func(b *Box2D, v float64) { b.X1 = v + m.X } |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
175 y1 = func(b *Box2D, v float64) { b.Y1 = v + m.Y } |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
176 width = func(b *Box2D, v float64) { b.X2 = b.X1 + v } |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
177 height = func(b *Box2D, v float64) { b.Y2 = b.Y1 + v } |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
178 ) |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
179 for _, unproj := range []func(*Box2D, float64){x1, y1, width, height} { |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
180 invDelta := common.InvDelta() |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
181 for i := range boxes { |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
182 v, err := binary.ReadVarint(r) |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
183 if err != nil { |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
184 return err |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
185 } |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
186 unproj(&boxes[i], unquant(invDelta(v))) |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
187 } |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
188 } |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
189 return nil |
5690
da9720b4aa42
More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5689
diff
changeset
|
190 } |
da9720b4aa42
More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5689
diff
changeset
|
191 |
da9720b4aa42
More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5689
diff
changeset
|
192 func (s *STRTree) deserializeIndexV2(r *bufio.Reader) error { |
5695
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
193 var numIndices uint32 |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
194 if err := binary.Read(r, binary.LittleEndian, &numIndices); err != nil { |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
195 return err |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
196 } |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
197 index := make([]int32, numIndices) |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
198 s.index = index |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
199 invDelta := common.InvDelta() |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
200 for i := range index { |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
201 d, err := binary.ReadVarint(r) |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
202 if err != nil { |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
203 return err |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
204 } |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
205 index[i] = int32(invDelta(d)) |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
206 } |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
207 return nil |
5690
da9720b4aa42
More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5689
diff
changeset
|
208 } |
da9720b4aa42
More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5689
diff
changeset
|
209 |
da9720b4aa42
More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5689
diff
changeset
|
210 func (t *Tin) deserializeV2(r *bufio.Reader) error { |
5692
d920f0fa2f04
User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5691
diff
changeset
|
211 return serializer(r, t, |
5691
9d2e74225104
Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5690
diff
changeset
|
212 (*Tin).deserializeEPSG, |
9d2e74225104
Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5690
diff
changeset
|
213 (*Tin).deserializeExtent, |
9d2e74225104
Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5690
diff
changeset
|
214 (*Tin).deserializeVerticesV2, |
9d2e74225104
Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5690
diff
changeset
|
215 (*Tin).deserializeTrianglesV2, |
9d2e74225104
Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5690
diff
changeset
|
216 ) |
9d2e74225104
Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5690
diff
changeset
|
217 } |
9d2e74225104
Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5690
diff
changeset
|
218 |
9d2e74225104
Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5690
diff
changeset
|
219 func (t *Tin) deserializeVerticesV2(r *bufio.Reader) error { |
5695
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
220 var numVertices uint32 |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
221 if err := binary.Read(r, binary.LittleEndian, &numVertices); err != nil { |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
222 return err |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
223 } |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
224 vertices := make([]Vertex, numVertices) |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
225 t.Vertices = vertices |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
226 m := t.Min |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
227 for dim := range 3 { |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
228 invDelta := common.InvDelta() |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
229 for i := range vertices { |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
230 d, err := binary.ReadVarint(r) |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
231 if err != nil { |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
232 return err |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
233 } |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
234 v := unquant(invDelta(d)) |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
235 switch dim { |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
236 case 0: |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
237 vertices[i].X = v + m.X |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
238 case 1: |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
239 vertices[i].Y = v + m.Y |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
240 case 2: |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
241 vertices[i].Z = v + m.Z |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
242 } |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
243 } |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
244 } |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
245 return nil |
5691
9d2e74225104
Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5690
diff
changeset
|
246 } |
9d2e74225104
Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5690
diff
changeset
|
247 |
9d2e74225104
Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5690
diff
changeset
|
248 func (t *Tin) deserializeTrianglesV2(r *bufio.Reader) error { |
5695
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
249 var numTriangles uint32 |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
250 if err := binary.Read(r, binary.LittleEndian, &numTriangles); err != nil { |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
251 return err |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
252 } |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
253 indices := make([]int32, 3*numTriangles) |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
254 triangles := make([][]int32, numTriangles) |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
255 t.Triangles = triangles |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
256 invDelta := common.InvDelta() |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
257 for i := range triangles { |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
258 tri := indices[:3] |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
259 indices = indices[3:] |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
260 triangles[i] = tri |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
261 for j := range tri { |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
262 v, err := binary.ReadVarint(r) |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
263 if err != nil { |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
264 return err |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
265 } |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
266 tri[j] = int32(invDelta(v)) |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
267 } |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
268 } |
ef80748ae4f3
Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5692
diff
changeset
|
269 return nil |
5686
c33a5354328d
Add stubs for de/serialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5685
diff
changeset
|
270 } |
c33a5354328d
Add stubs for de/serialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5685
diff
changeset
|
271 |
c33a5354328d
Add stubs for de/serialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5685
diff
changeset
|
272 // optimizeForSerializationV2 prepares the mesh to be stored in V2. |
5680
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
273 func (s *STRTree) optimizeForSerializationV2() { |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
274 s.removeUnusedTriangles() |
5684
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
275 s.sortVertices() |
5682
33499bd1b829
Sort indices in spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5680
diff
changeset
|
276 s.sortIndices() |
5680
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
277 } |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
278 |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
279 // removeUnusedTriangles removes all triangles from the |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
280 // TIN that are not registered in the spatial index. |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
281 func (s *STRTree) removeUnusedTriangles() { |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
282 used := make([]bool, len(s.tin.Triangles)) |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
283 unused := len(used) |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
284 s.allTriangleIndices(func(indices []int32) { |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
285 for _, idx := range indices { |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
286 used[idx] = true |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
287 unused-- // They only occur once in the spatial index. |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
288 } |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
289 }) |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
290 if unused <= 0 { |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
291 return |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
292 } |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
293 newTris := make([][]int32, 0, len(s.tin.Triangles)-unused) |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
294 remap := map[int32]int32{} |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
295 for idx, tri := range s.tin.Triangles { |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
296 if used[idx] { |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
297 remap[int32(idx)] = int32(len(newTris)) |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
298 newTris = append(newTris, tri) |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
299 } |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
300 } |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
301 s.tin.Triangles = newTris |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
302 // Update the spatial index as the gaps are now closed. |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
303 s.allTriangleIndices(func(indices []int32) { |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
304 for i, idx := range indices { |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
305 indices[i] = remap[idx] |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
306 } |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
307 }) |
a87900c0fd11
Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff
changeset
|
308 } |
5684
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
309 |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
310 // sortVertices so that the deltas between neighbors are minimized. |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
311 func (s *STRTree) sortVertices() { |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
312 vertices := s.tin.Vertices |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
313 indices := make([]int32, len(vertices)) |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
314 for i := range len(indices) { |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
315 indices[i] = int32(i) |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
316 } |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
317 |
5685
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
318 // Take aspect ratio of bbox into account. |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
319 width := s.tin.Max.X - s.tin.Min.X |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
320 height := s.tin.Max.Y - s.tin.Min.Y |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
321 if width == 0 || height == 0 { |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
322 return |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
323 } |
5684
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
324 |
5685
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
325 // v = len(vertices) |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
326 // r = max(w, h)/min(w, h) |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
327 // n * t = v <=> n = v/t |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
328 // n / t = r <=> n = r*t |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
329 // v/t = r*t |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
330 // v = r*t^2 |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
331 // v/r = t^2 |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
332 // t = sqrt(v/r) |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
333 r := float64(max(width, height)) / float64(min(width, height)) |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
334 t := int(math.Ceil(math.Sqrt(float64(len(vertices)) / r))) |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
335 |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
336 var d1, d2 func(int32, int32) int |
5684
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
337 |
5685
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
338 if width > height { |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
339 // Sort in X first and slices alternating up and down |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
340 slices.SortFunc(indices, func(a, b int32) int { |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
341 return cmp.Compare(vertices[a].X, vertices[b].X) |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
342 }) |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
343 d1 = func(a, b int32) int { return cmp.Compare(vertices[a].Y, vertices[b].Y) } |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
344 d2 = func(a, b int32) int { return cmp.Compare(vertices[b].Y, vertices[a].Y) } |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
345 } else { |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
346 // Sort in Y first and slices alternating left and right |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
347 slices.SortFunc(indices, func(a, b int32) int { |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
348 return cmp.Compare(vertices[a].Y, vertices[b].Y) |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
349 }) |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
350 d1 = func(a, b int32) int { return cmp.Compare(vertices[a].X, vertices[b].X) } |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
351 d2 = func(a, b int32) int { return cmp.Compare(vertices[b].X, vertices[a].X) } |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
352 } |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
353 |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
354 for p := indices; len(p) > 0; d1, d2 = d2, d1 { |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
355 l := min(len(p), t) |
0ee8ace01b60
When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5684
diff
changeset
|
356 slices.SortStableFunc(p[:l], d2) |
5684
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
357 p = p[l:] |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
358 } |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
359 |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
360 // We really need to to sort the vertices actually, too. |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
361 sort.Slice(vertices, func(i, j int) bool { return indices[i] < indices[j] }) |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
362 |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
363 reindices := make([]int32, len(indices)) |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
364 for i, idx := range indices { |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
365 reindices[idx] = int32(i) |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
366 } |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
367 |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
368 // Update the indices in the triangles. |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
369 for _, tri := range s.tin.Triangles { |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
370 for i, idx := range tri { |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
371 tri[i] = reindices[idx] |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
372 } |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
373 } |
536e842d9bfa
Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
5682
diff
changeset
|
374 } |