Mercurial > gemma
diff pkg/octree/classbreaks.go @ 3882:37d5c4441c70
Use custom morpho class breaks in sounding result contour generation.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Wed, 10 Jul 2019 11:45:55 +0200 |
parents | 631f5eaf29de |
children | 49564382ffff |
line wrap: on
line diff
--- a/pkg/octree/classbreaks.go Wed Jul 10 09:47:02 2019 +0200 +++ b/pkg/octree/classbreaks.go Wed Jul 10 11:45:55 2019 +0200 @@ -77,7 +77,7 @@ classes := make([]float64, 0, len(parts)) for _, part := range parts { if idx := strings.IndexRune(part, ':'); idx >= 0 { - part = part[idx+1:] + part = part[:idx] } if part = strings.TrimSpace(part); part == "" { continue @@ -93,6 +93,45 @@ return classes, nil } +func ExtrapolateClassBreaks(cbs []float64, min, max float64) []float64 { + if min > max { + min, max = max, min + } + + if len(cbs) < 2 { + return cbs + } + + if min >= cbs[0] && max <= cbs[len(cbs)-1] { + return cbs + } + + n := make([]float64, len(cbs)) + copy(n, cbs) + sort.Float64s(n) + + for min < n[0] { + diff := n[1] - n[0] + if diff == 0 { + break + } + m := make([]float64, len(n)+1) + m[0] = n[0] - diff + copy(m[1:], n) + n = m + } + + for max > n[len(n)-1] { + diff := n[len(n)-1] - n[len(n)-2] + if diff == 0 { + break + } + n = append(n, n[len(n)-1]+diff) + } + + return n +} + func InBetweenClassBreaks(cbs []float64, min float64, steps int) []float64 { if len(cbs) < 2 || steps < 2 { return cbs