comparison 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
comparison
equal deleted inserted replaced
3881:7db6999962db 3882:37d5c4441c70
75 75
76 parts := strings.Split(config.String, ",") 76 parts := strings.Split(config.String, ",")
77 classes := make([]float64, 0, len(parts)) 77 classes := make([]float64, 0, len(parts))
78 for _, part := range parts { 78 for _, part := range parts {
79 if idx := strings.IndexRune(part, ':'); idx >= 0 { 79 if idx := strings.IndexRune(part, ':'); idx >= 0 {
80 part = part[idx+1:] 80 part = part[:idx]
81 } 81 }
82 if part = strings.TrimSpace(part); part == "" { 82 if part = strings.TrimSpace(part); part == "" {
83 continue 83 continue
84 } 84 }
85 v, err := strconv.ParseFloat(part, 64) 85 v, err := strconv.ParseFloat(part, 64)
89 classes = append(classes, v) 89 classes = append(classes, v)
90 } 90 }
91 91
92 sort.Float64s(classes) 92 sort.Float64s(classes)
93 return classes, nil 93 return classes, nil
94 }
95
96 func ExtrapolateClassBreaks(cbs []float64, min, max float64) []float64 {
97 if min > max {
98 min, max = max, min
99 }
100
101 if len(cbs) < 2 {
102 return cbs
103 }
104
105 if min >= cbs[0] && max <= cbs[len(cbs)-1] {
106 return cbs
107 }
108
109 n := make([]float64, len(cbs))
110 copy(n, cbs)
111 sort.Float64s(n)
112
113 for min < n[0] {
114 diff := n[1] - n[0]
115 if diff == 0 {
116 break
117 }
118 m := make([]float64, len(n)+1)
119 m[0] = n[0] - diff
120 copy(m[1:], n)
121 n = m
122 }
123
124 for max > n[len(n)-1] {
125 diff := n[len(n)-1] - n[len(n)-2]
126 if diff == 0 {
127 break
128 }
129 n = append(n, n[len(n)-1]+diff)
130 }
131
132 return n
94 } 133 }
95 134
96 func InBetweenClassBreaks(cbs []float64, min float64, steps int) []float64 { 135 func InBetweenClassBreaks(cbs []float64, min float64, steps int) []float64 {
97 if len(cbs) < 2 || steps < 2 { 136 if len(cbs) < 2 || steps < 2 {
98 return cbs 137 return cbs