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