From 4f9044cda4d15d943c71d6f84c18290e6f3861d2 Mon Sep 17 00:00:00 2001 From: Tom Payne Date: Mon, 30 Jul 2012 13:02:48 +0200 Subject: [PATCH] Add ol.array utility functions --- src/ol/base/array.js | 59 +++++++++++++++++++++++++++++++++++++++ src/ol/base/array_test.js | 46 ++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 src/ol/base/array.js create mode 100644 src/ol/base/array_test.js diff --git a/src/ol/base/array.js b/src/ol/base/array.js new file mode 100644 index 0000000000..2a1ce13de4 --- /dev/null +++ b/src/ol/base/array.js @@ -0,0 +1,59 @@ +goog.provide('ol.array'); + +goog.require('goog.array'); + + +/** + * @param {Array.} arr Array. + * @param {number} target Target. + * @return {number} Index. + */ +ol.array.binaryFindNearest = function(arr, target) { + var index = goog.array.binarySearch(arr, target, function(a, b) { + return b - a; + }); + if (index >= 0) { + return index; + } else if (index == -1) { + return 0; + } else if (index == -arr.length - 1) { + return arr.length - 1; + } else { + var left = -index - 2; + var right = -index - 1; + if (arr[left] - target < target - arr[right]) { + return left; + } else { + return right; + } + } +}; + + +/** + * @param {Array.} arr Array. + * @param {number} target Target. + * @return {number} Index. + */ +ol.array.linearFindNearest = function(arr, target) { + var n = arr.length; + if (arr[0] <= target) { + return 0; + } else if (target <= arr[n - 1]) { + return n - 1; + } else { + var i; + for (i = 1; i < n; ++i) { + if (arr[i] == target) { + return i; + } else if (arr[i] < target) { + if (arr[i - 1] - target < target - arr[i]) { + return i - 1; + } else { + return i; + } + } + } + return n - 1; + } +}; diff --git a/src/ol/base/array_test.js b/src/ol/base/array_test.js new file mode 100644 index 0000000000..168f9e6639 --- /dev/null +++ b/src/ol/base/array_test.js @@ -0,0 +1,46 @@ +goog.require('goog.testing.jsunit'); +goog.require('ol.array'); + + +function testBinaryFindNearest() { + var arr = [1000, 500, 100]; + + assertEquals(0, ol.array.binaryFindNearest(arr, 10000)); + assertEquals(0, ol.array.binaryFindNearest(arr, 1000)); + assertEquals(0, ol.array.binaryFindNearest(arr, 900)); + + assertEquals(1, ol.array.binaryFindNearest(arr, 750)); + + assertEquals(1, ol.array.binaryFindNearest(arr, 550)); + assertEquals(1, ol.array.binaryFindNearest(arr, 500)); + assertEquals(1, ol.array.binaryFindNearest(arr, 450)); + + assertEquals(2, ol.array.binaryFindNearest(arr, 300)); + + assertEquals(2, ol.array.binaryFindNearest(arr, 200)); + assertEquals(2, ol.array.binaryFindNearest(arr, 100)); + assertEquals(2, ol.array.binaryFindNearest(arr, 50)); + +} + + +function testLinearFindNearest() { + var arr = [1000, 500, 100]; + + assertEquals(0, ol.array.linearFindNearest(arr, 10000)); + assertEquals(0, ol.array.linearFindNearest(arr, 1000)); + assertEquals(0, ol.array.linearFindNearest(arr, 900)); + + assertEquals(1, ol.array.linearFindNearest(arr, 750)); + + assertEquals(1, ol.array.linearFindNearest(arr, 550)); + assertEquals(1, ol.array.linearFindNearest(arr, 500)); + assertEquals(1, ol.array.linearFindNearest(arr, 450)); + + assertEquals(2, ol.array.linearFindNearest(arr, 300)); + + assertEquals(2, ol.array.linearFindNearest(arr, 200)); + assertEquals(2, ol.array.linearFindNearest(arr, 100)); + assertEquals(2, ol.array.linearFindNearest(arr, 50)); + +}