diff pkg/mesh/meshserialize_v2.go @ 5680:a87900c0fd11 sr-v2

Remove triangles that are not registered in the spatial index.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Sun, 11 Feb 2024 18:40:37 +0100
parents
children 33499bd1b829
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pkg/mesh/meshserialize_v2.go	Sun Feb 11 18:40:37 2024 +0100
@@ -0,0 +1,50 @@
+// This is Free Software under GNU Affero General Public License v >= 3.0
+// without warranty, see README.md and license for details.
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+// License-Filename: LICENSES/AGPL-3.0.txt
+//
+// Copyright (C) 2024 by via donau
+//   – Österreichische Wasserstraßen-Gesellschaft mbH
+// Software engineering by Intevation GmbH
+//
+// Author(s):
+//  * Sascha L. Teichmann <sascha.teichmann@intevation.de>
+
+package mesh
+
+func (s *STRTree) optimizeForSerializationV2() {
+	s.removeUnusedTriangles()
+	// TODO: Implement me!
+}
+
+// removeUnusedTriangles removes all triangles from the
+// TIN that are not registered in the spatial index.
+func (s *STRTree) removeUnusedTriangles() {
+	used := make([]bool, len(s.tin.Triangles))
+	unused := len(used)
+	s.allTriangleIndices(func(indices []int32) {
+		for _, idx := range indices {
+			used[idx] = true
+			unused-- // They only occur once in the spatial index.
+		}
+	})
+	if unused <= 0 {
+		return
+	}
+	newTris := make([][]int32, 0, len(s.tin.Triangles)-unused)
+	remap := map[int32]int32{}
+	for idx, tri := range s.tin.Triangles {
+		if used[idx] {
+			remap[int32(idx)] = int32(len(newTris))
+			newTris = append(newTris, tri)
+		}
+	}
+	s.tin.Triangles = newTris
+	// Update the spatial index as the gaps are now closed.
+	s.allTriangleIndices(func(indices []int32) {
+		for i, idx := range indices {
+			indices[i] = remap[idx]
+		}
+	})
+}