|
2200 | 2200 | JSROOT.TH2Painter.prototype.CompressAxis = function(arr, maxlen, regular) { |
2201 | 2201 | if (arr.length <= maxlen) return; |
2202 | 2202 |
|
| 2203 | + // check filled bins |
| 2204 | + var left = 0, right = arr.length-2; |
| 2205 | + while ((left < right) && (arr[left].cnt===0)) ++left; |
| 2206 | + while ((left < right) && (arr[right].cnt===0)) --right; |
| 2207 | + if ((left==right) || (right-left < maxlen)) return; |
| 2208 | + |
2203 | 2209 | function RemoveNulls() { |
2204 | | - var j = arr.length-2; |
2205 | | - while (j>0) { |
2206 | | - while ((j>0) && (arr[j]!=null)) --j; |
| 2210 | + var j = right; |
| 2211 | + while (j>left) { |
| 2212 | + while ((j>left) && (arr[j]!=null)) --j; |
2207 | 2213 | var j2 = j; |
2208 | 2214 | while ((j>0) && (arr[j]==null)) --j; |
2209 | 2215 | if (j < j2) arr.splice(j+1, j2-j); |
|
2212 | 2218 | }; |
2213 | 2219 |
|
2214 | 2220 | if (!regular) { |
2215 | | - var grdist = Math.abs(arr[arr.length-1].gr - arr[0].gr) / maxlen; |
| 2221 | + var grdist = Math.abs(arr[right+1].gr - arr[left].gr) / maxlen; |
2216 | 2222 | var i = 0; |
2217 | | - while (i < arr.length-1) { |
| 2223 | + while (i <= right) { |
2218 | 2224 | var gr0 = arr[i++].gr; |
2219 | 2225 | // remove points which are not far away from current |
2220 | | - while ((i < arr.length-1) && (Math.abs(arr[i+1].gr - gr0) < grdist)) arr[i++] = null; |
| 2226 | + while ((i <= right) && (Math.abs(arr[i+1].gr - gr0) < grdist)) arr[i++] = null; |
2221 | 2227 | } |
2222 | 2228 | RemoveNulls(); |
2223 | 2229 | } |
2224 | 2230 |
|
2225 | | - if (regular || (arr.length > 1.5*maxlen)) { |
| 2231 | + if (regular || ((right-left) > 1.5*maxlen)) { |
2226 | 2232 | // just remove regular number of bins |
2227 | | - var period = Math.floor(arr.length / maxlen); |
| 2233 | + var period = Math.floor((right-left) / maxlen); |
2228 | 2234 | if (period<2) period = 2; |
2229 | | - var i = 0; |
2230 | | - while (++i < arr.length) { |
| 2235 | + var i = left; |
| 2236 | + while (++i <= right) { |
2231 | 2237 | for (var k=1;k<period;++k) |
2232 | | - if (++i < arr.length - 1) arr[i] = null; |
| 2238 | + if (++i <= right) arr[i] = null; |
2233 | 2239 | } |
2234 | 2240 | RemoveNulls(); |
2235 | 2241 | } |
|
2249 | 2255 | for (var i = i1; i <= i2; ++i) { |
2250 | 2256 | var x = this.GetBinX(i); |
2251 | 2257 | if (this.options.Logx && (x <= 0)) continue; |
2252 | | - xx.push({indx:i, axis: x, gr: this.grx(x)}); |
| 2258 | + xx.push({indx:i, axis: x, gr: this.grx(x), cnt:0}); |
2253 | 2259 | } |
2254 | 2260 |
|
2255 | 2261 | for (var j = j1; j <= j2; ++j) { |
2256 | 2262 | var y = this.GetBinY(j); |
2257 | 2263 | if (this.options.Logy && (y <= 0)) continue; |
2258 | | - yy.push({indx:j, axis: y, gr: this.gry(y)}); |
| 2264 | + yy.push({indx:j, axis: y, gr: this.gry(y), cnt:0}); |
2259 | 2265 | } |
2260 | 2266 |
|
2261 | 2267 | // first found min/max values in selected range, and number of non-zero bins |
|
2295 | 2301 | binz = this.histo.getBinContent(i + 1, j + 1); |
2296 | 2302 | if ((binz == 0) || (binz < this.minbin)) continue; |
2297 | 2303 |
|
| 2304 | + var show = false; |
| 2305 | + |
2298 | 2306 | if (coordinates_kind == 0) { |
2299 | | - if (this.getValueColor(binz) != null) nbins++; |
| 2307 | + if (this.getValueColor(binz) != null) show = true; |
2300 | 2308 | } else { |
2301 | 2309 | zdiff = uselogz ? (logmax - ((binz>0) ? Math.log(binz) : logmin)) : this.maxbin - binz; |
2302 | 2310 | dgrx = zdiff * xfactor; |
2303 | 2311 | dgry = zdiff * yfactor; |
2304 | 2312 |
|
2305 | 2313 | if (((1 - 2*zdiff*xfactor)*(xx[i-i1+1].gr - xx[i-i1].gr) > 0.05) || |
2306 | | - ((1 - 2*zdiff*yfactor)*(yy[j-j1].gr - yy[j-j1+1].gr) > 0.05)) nbins++; |
| 2314 | + ((1 - 2*zdiff*yfactor)*(yy[j-j1].gr - yy[j-j1+1].gr) > 0.05)) show = true; |
| 2315 | + } |
| 2316 | + |
| 2317 | + if (show) { |
| 2318 | + nbins++; |
| 2319 | + xx[i-i1].cnt+=1; |
| 2320 | + yy[j-j1].cnt+=1; |
2307 | 2321 | } |
2308 | 2322 | } |
2309 | 2323 | } |
|
0 commit comments