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