changeset 3770:71164b817d6e simplify-sounding-results

Calculate distance from planes.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 25 Jun 2019 21:04:16 +0200
parents 6838526df94c
children b7530ed07561
files cmd/srsimplify/main.go pkg/octree/vertex.go
diffstat 2 files changed, 14 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/cmd/srsimplify/main.go	Tue Jun 25 18:28:34 2019 +0200
+++ b/cmd/srsimplify/main.go	Tue Jun 25 21:04:16 2019 +0200
@@ -127,15 +127,20 @@
 	top := points[maxIdx]
 
 	tris := make([]octree.Triangle, len(corners))
+	planes := make([]octree.Plane3D, len(corners))
 
 	for i, v1 := range corners {
 		v2 := corners[(i+1)%len(corners)]
 		tris[i] = octree.Triangle{v1, v2, top}
+		planes[i] = tris[i].Plane3D()
 	}
 
 	parts := make([][]octree.Vertex, len(tris))
 	var rest int
 
+	maxDists := make([]float64, len(planes))
+	maxIdxs := make([]int, len(planes))
+
 nextPoint:
 	for i, v := range points {
 		if i == maxIdx {
@@ -144,6 +149,10 @@
 
 		for j := range tris {
 			if tris[j].Contains(v.X, v.Y) {
+				if dist := math.Abs(planes[j].Eval(v)); dist > maxDists[j] {
+					maxDists[j] = dist
+					maxIdxs[j] = len(parts[j])
+				}
 				parts[j] = append(parts[j], v)
 				continue nextPoint
 			}
@@ -152,7 +161,7 @@
 	}
 
 	for i, part := range parts {
-		log.Printf("%d: %d\n", i, len(part))
+		log.Printf("%d: %d %.5f\n", i, len(part), maxDists[i])
 	}
 	log.Printf("rest: %d\n", rest)
 
--- a/pkg/octree/vertex.go	Tue Jun 25 18:28:34 2019 +0200
+++ b/pkg/octree/vertex.go	Tue Jun 25 21:04:16 2019 +0200
@@ -110,6 +110,10 @@
 	return -(p.A*x + p.B*y + p.D) / p.C
 }
 
+func (p Plane3D) Eval(v Vertex) float64 {
+	return p.A*v.X + p.B*v.Y + p.C*v.Z + p.D
+}
+
 func (v Vertex) Normalize() Vertex {
 	s := 1 / v.Length()
 	return Vertex{