| 279 | | var system = this.measurementProperties[this.displaySystem]; |
|---|
| 280 | | var numUnits = system.units.length; |
|---|
| 281 | | var comp = new Array(numUnits); |
|---|
| 282 | | var numDiv = this.divisions * this.subdivisions; |
|---|
| 283 | | for(var unitIndex = 0; unitIndex < numUnits; ++unitIndex) { |
|---|
| 284 | | comp[unitIndex] = {}; |
|---|
| 285 | | var pixelsPerDisplayUnit = OpenLayers.DOTS_PER_INCH * |
|---|
| 286 | | system.inches[unitIndex] / |
|---|
| 287 | | this.scale; |
|---|
| 288 | | var minSDDisplayLength = ((this.minWidth - this.xOffsetNumbersBox) / |
|---|
| 289 | | pixelsPerDisplayUnit) / |
|---|
| 290 | | (numDiv); |
|---|
| 291 | | var maxSDDisplayLength = ((this.maxWidth - this.xOffsetNumbersBox) / |
|---|
| 292 | | pixelsPerDisplayUnit) / |
|---|
| 293 | | (numDiv); |
|---|
| 294 | | // add up scores for each marker (even if numbers aren't displayed) |
|---|
| 295 | | for(var valueIndex = 0; valueIndex < (numDiv); ++valueIndex) { |
|---|
| 296 | | var minNumber = minSDDisplayLength * (valueIndex + 1); |
|---|
| 297 | | var maxNumber = maxSDDisplayLength * (valueIndex + 1); |
|---|
| 298 | | var num = this.getHandsomeNumber(minNumber, maxNumber); |
|---|
| 299 | | comp[unitIndex][valueIndex] = { |
|---|
| 300 | | value: (num.value / (valueIndex + 1)), |
|---|
| 301 | | score: 0, |
|---|
| 302 | | tieBreaker: 0, |
|---|
| 303 | | numDec: 0, |
|---|
| 304 | | displayed: 0 |
|---|
| 305 | | }; |
|---|
| 306 | | // now tally up scores for all values given this subdivision length |
|---|
| 307 | | for(var valueIndex2 = 0; valueIndex2 < numDiv; ++valueIndex2) { |
|---|
| 308 | | var displayedValuePosition = num.value * (valueIndex2 + 1) / (valueIndex + 1); |
|---|
| 309 | | var num2 = this.getHandsomeNumber(displayedValuePosition, displayedValuePosition); |
|---|
| 310 | | var major = ((valueIndex2 + 1) % this.subdivisions == 0); |
|---|
| 311 | | var last = ((valueIndex2 + 1) == numDiv); |
|---|
| 312 | | if((this.singleLine && last) || |
|---|
| 313 | | (!this.singleLine && (major || this.showMinorMeasures))) { |
|---|
| 314 | | // count scores for displayed marker measurements |
|---|
| 315 | | comp[unitIndex][valueIndex].score += num2.score; |
|---|
| 316 | | comp[unitIndex][valueIndex].tieBreaker += num2.tieBreaker; |
|---|
| 317 | | comp[unitIndex][valueIndex].numDec = Math.max(comp[unitIndex][valueIndex].numDec, num2.numDec); |
|---|
| 318 | | comp[unitIndex][valueIndex].displayed += 1; |
|---|
| 319 | | } else { |
|---|
| 320 | | // count scores for non-displayed marker measurements |
|---|
| 321 | | comp[unitIndex][valueIndex].score += num2.score / this.subdivisions; |
|---|
| 322 | | comp[unitIndex][valueIndex].tieBreaker += num2.tieBreaker / this.subdivisions; |
|---|
| 323 | | } |
|---|
| 324 | | } |
|---|
| 325 | | // adjust scores so numbers closer to 1 are preferred for display |
|---|
| 326 | | var scoreAdjustment = (unitIndex + 1) * |
|---|
| 327 | | comp[unitIndex][valueIndex].tieBreaker / |
|---|
| 328 | | comp[unitIndex][valueIndex].displayed; |
|---|
| 329 | | comp[unitIndex][valueIndex].score *= scoreAdjustment; |
|---|
| 330 | | } |
|---|
| 331 | | } |
|---|
| | 279 | var comp = this.getComp(); |
|---|
| 333 | | var subdivisionDisplayLength = null; |
|---|
| 334 | | var displayUnits = null; |
|---|
| 335 | | var displayUnitsAbbr = null; |
|---|
| 336 | | var subdivisionPixelLength = null; |
|---|
| 337 | | var bestScore = Number.POSITIVE_INFINITY; |
|---|
| 338 | | var bestTieBreaker = Number.POSITIVE_INFINITY; |
|---|
| 339 | | var numDec = 0; |
|---|
| 340 | | for(var unitIndex = 0; unitIndex < comp.length; ++unitIndex) { |
|---|
| 341 | | for(valueIndex in comp[unitIndex]) { |
|---|
| 342 | | if((comp[unitIndex][valueIndex].score < bestScore) || |
|---|
| 343 | | ((comp[unitIndex][valueIndex].score == bestScore) && |
|---|
| 344 | | (comp[unitIndex][valueIndex].tieBreaker < bestTieBreaker))) { |
|---|
| 345 | | bestScore = comp[unitIndex][valueIndex].score; |
|---|
| 346 | | bestTieBreaker = comp[unitIndex][valueIndex].tieBreaker; |
|---|
| 347 | | subdivisionDisplayLength = comp[unitIndex][valueIndex].value; |
|---|
| 348 | | numDec = comp[unitIndex][valueIndex].numDec; |
|---|
| 349 | | displayUnits = system.units[unitIndex]; |
|---|
| 350 | | displayUnitsAbbr = system.abbr[unitIndex]; |
|---|
| 351 | | pixelsPerDisplayUnit = OpenLayers.DOTS_PER_INCH * |
|---|
| 352 | | system.inches[unitIndex] / |
|---|
| 353 | | this.scale; |
|---|
| 354 | | subdivisionPixelLength = pixelsPerDisplayUnit * subdivisionDisplayLength; // round before use in style |
|---|
| 355 | | } |
|---|
| 356 | | } |
|---|
| 357 | | } |
|---|
| | 281 | this.setSubProps(comp); |
|---|
| | 427 | }, |
|---|
| | 428 | |
|---|
| | 429 | /** |
|---|
| | 430 | * Method: getComp |
|---|
| | 431 | * Get comparison matrix. |
|---|
| | 432 | */ |
|---|
| | 433 | getComp: function() { |
|---|
| | 434 | var system = this.measurementProperties[this.displaySystem]; |
|---|
| | 435 | var numUnits = system.units.length; |
|---|
| | 436 | var comp = new Array(numUnits); |
|---|
| | 437 | var numDiv = this.divisions * this.subdivisions; |
|---|
| | 438 | for(var unitIndex = 0; unitIndex < numUnits; ++unitIndex) { |
|---|
| | 439 | comp[unitIndex] = {}; |
|---|
| | 440 | var pixelsPerDisplayUnit = OpenLayers.DOTS_PER_INCH * |
|---|
| | 441 | system.inches[unitIndex] / |
|---|
| | 442 | this.scale; |
|---|
| | 443 | var minSDDisplayLength = ((this.minWidth - this.xOffsetNumbersBox) / |
|---|
| | 444 | pixelsPerDisplayUnit) / numDiv; |
|---|
| | 445 | var maxSDDisplayLength = ((this.maxWidth - this.xOffsetNumbersBox) / |
|---|
| | 446 | pixelsPerDisplayUnit) / numDiv; |
|---|
| | 447 | // add up scores for each marker (even if numbers aren't displayed) |
|---|
| | 448 | for(var valueIndex = 0; valueIndex < numDiv; ++valueIndex) { |
|---|
| | 449 | var minNumber = minSDDisplayLength * (valueIndex + 1); |
|---|
| | 450 | var maxNumber = maxSDDisplayLength * (valueIndex + 1); |
|---|
| | 451 | var num = this.getHandsomeNumber(minNumber, maxNumber); |
|---|
| | 452 | var compNum = { |
|---|
| | 453 | value: (num.value / (valueIndex + 1)), |
|---|
| | 454 | score: 0, |
|---|
| | 455 | tie: 0, |
|---|
| | 456 | dec: 0, |
|---|
| | 457 | displayed: 0 |
|---|
| | 458 | }; |
|---|
| | 459 | // tally up scores for all values given this subdivision length |
|---|
| | 460 | for(var valueIndex2 = 0; valueIndex2 < numDiv; ++valueIndex2) { |
|---|
| | 461 | var position = num.value * (valueIndex2 + 1) / (valueIndex + 1); |
|---|
| | 462 | var num2 = this.getHandsomeNumber(position, position); |
|---|
| | 463 | var major = ((valueIndex2 + 1) % this.subdivisions == 0); |
|---|
| | 464 | var last = ((valueIndex2 + 1) == numDiv); |
|---|
| | 465 | if((this.singleLine && last) || |
|---|
| | 466 | (!this.singleLine && (major || this.showMinorMeasures))) { |
|---|
| | 467 | // count scores for displayed marker measurements |
|---|
| | 468 | compNum.score += num2.score; |
|---|
| | 469 | compNum.tie += num2.tie; |
|---|
| | 470 | compNum.dec = Math.max(compNum.dec, num2.dec); |
|---|
| | 471 | compNum.displayed += 1; |
|---|
| | 472 | } else { |
|---|
| | 473 | // count scores for non-displayed marker measurements |
|---|
| | 474 | compNum.score += num2.score / this.subdivisions; |
|---|
| | 475 | compNum.tie += num2.tie / this.subdivisions; |
|---|
| | 476 | } |
|---|
| | 477 | } |
|---|
| | 478 | // adjust scores so numbers closer to 1 are preferred for display |
|---|
| | 479 | var scoreAdjustment = (unitIndex + 1) * |
|---|
| | 480 | compNum.tie / |
|---|
| | 481 | compNum.displayed; |
|---|
| | 482 | compNum.score *= scoreAdjustment; |
|---|
| | 483 | comp[unitIndex][valueIndex] = compNum; |
|---|
| | 484 | } |
|---|
| | 485 | } |
|---|
| | 486 | return comp; |
|---|
| | 487 | }, |
|---|
| | 488 | |
|---|
| | 489 | /** |
|---|
| | 490 | * Method: setSubProps |
|---|
| | 491 | * Set subdivision properties based on comparison matrix. |
|---|
| | 492 | */ |
|---|
| | 493 | setSubProps: function(comp) { |
|---|
| | 494 | var system = this.measurementProperties[this.displaySystem]; |
|---|
| | 495 | var length = null; |
|---|
| | 496 | var pixels = null; |
|---|
| | 497 | var units = null; |
|---|
| | 498 | var abbr = null; |
|---|
| | 499 | var score = Number.POSITIVE_INFINITY; |
|---|
| | 500 | var tie = Number.POSITIVE_INFINITY; |
|---|
| | 501 | var dec = 0; |
|---|
| | 502 | for(var unitIndex = 0; unitIndex < comp.length; ++unitIndex) { |
|---|
| | 503 | for(valueIndex in comp[unitIndex]) { |
|---|
| | 504 | if((comp[unitIndex][valueIndex].score < score) || |
|---|
| | 505 | ((comp[unitIndex][valueIndex].score == score) && |
|---|
| | 506 | (comp[unitIndex][valueIndex].tie < tie))) { |
|---|
| | 507 | score = comp[unitIndex][valueIndex].score; |
|---|
| | 508 | tie = comp[unitIndex][valueIndex].tie; |
|---|
| | 509 | length = comp[unitIndex][valueIndex].value; |
|---|
| | 510 | dec = comp[unitIndex][valueIndex].dec; |
|---|
| | 511 | units = system.units[unitIndex]; |
|---|
| | 512 | abbr = system.abbr[unitIndex]; |
|---|
| | 513 | pixelsPerDisplayUnit = OpenLayers.DOTS_PER_INCH * |
|---|
| | 514 | system.inches[unitIndex] / |
|---|
| | 515 | this.scale; |
|---|
| | 516 | pixels = pixelsPerDisplayUnit * length; // round before use |
|---|
| | 517 | } |
|---|
| | 518 | } |
|---|
| | 519 | } |
|---|
| | 520 | this.subProps = { |
|---|
| | 521 | length: length, |
|---|
| | 522 | pixels: pixels, |
|---|
| | 523 | units: units, |
|---|
| | 524 | abbr: abbr, |
|---|
| | 525 | dec: dec |
|---|
| | 526 | }; |
|---|
| 614 | | var cmult, max, numDec, tmult, multiplier, score, tieBreaker; |
|---|
| 615 | | for(var halvingExp = 0; halvingExp < 3; ++halvingExp) { |
|---|
| 616 | | cmult = Math.pow(2, (-1 * halvingExp)); |
|---|
| | 639 | var cmult, max, dec, tmult, multiplier, score, tie; |
|---|
| | 640 | for(var hexp = 0; hexp < 3; ++hexp) { |
|---|
| | 641 | cmult = Math.pow(2, (-1 * hexp)); |
|---|