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