UNPKG

box-intersect

Version:
236 lines (221 loc) 4.63 kB
'use strict'; //This code is extracted from ndarray-sort //It is inlined here as a temporary workaround module.exports = wrapper; var INSERT_SORT_CUTOFF = 32 function wrapper(data, n0) { if (n0 <= 4*INSERT_SORT_CUTOFF) { insertionSort(0, n0 - 1, data); } else { quickSort(0, n0 - 1, data); } } function insertionSort(left, right, data) { var ptr = 2*(left+1) for(var i=left+1; i<=right; ++i) { var a = data[ptr++] var b = data[ptr++] var j = i var jptr = ptr-2 while(j-- > left) { var x = data[jptr-2] var y = data[jptr-1] if(x < a) { break } else if(x === a && y < b) { break } data[jptr] = x data[jptr+1] = y jptr -= 2 } data[jptr] = a data[jptr+1] = b } } function swap(i, j, data) { i *= 2 j *= 2 var x = data[i] var y = data[i+1] data[i] = data[j] data[i+1] = data[j+1] data[j] = x data[j+1] = y } function move(i, j, data) { i *= 2 j *= 2 data[i] = data[j] data[i+1] = data[j+1] } function rotate(i, j, k, data) { i *= 2 j *= 2 k *= 2 var x = data[i] var y = data[i+1] data[i] = data[j] data[i+1] = data[j+1] data[j] = data[k] data[j+1] = data[k+1] data[k] = x data[k+1] = y } function shufflePivot(i, j, px, py, data) { i *= 2 j *= 2 data[i] = data[j] data[j] = px data[i+1] = data[j+1] data[j+1] = py } function compare(i, j, data) { i *= 2 j *= 2 var x = data[i], y = data[j] if(x < y) { return false } else if(x === y) { return data[i+1] > data[j+1] } return true } function comparePivot(i, y, b, data) { i *= 2 var x = data[i] if(x < y) { return true } else if(x === y) { return data[i+1] < b } return false } function quickSort(left, right, data) { var sixth = (right - left + 1) / 6 | 0, index1 = left + sixth, index5 = right - sixth, index3 = left + right >> 1, index2 = index3 - sixth, index4 = index3 + sixth, el1 = index1, el2 = index2, el3 = index3, el4 = index4, el5 = index5, less = left + 1, great = right - 1, tmp = 0 if(compare(el1, el2, data)) { tmp = el1 el1 = el2 el2 = tmp } if(compare(el4, el5, data)) { tmp = el4 el4 = el5 el5 = tmp } if(compare(el1, el3, data)) { tmp = el1 el1 = el3 el3 = tmp } if(compare(el2, el3, data)) { tmp = el2 el2 = el3 el3 = tmp } if(compare(el1, el4, data)) { tmp = el1 el1 = el4 el4 = tmp } if(compare(el3, el4, data)) { tmp = el3 el3 = el4 el4 = tmp } if(compare(el2, el5, data)) { tmp = el2 el2 = el5 el5 = tmp } if(compare(el2, el3, data)) { tmp = el2 el2 = el3 el3 = tmp } if(compare(el4, el5, data)) { tmp = el4 el4 = el5 el5 = tmp } var pivot1X = data[2*el2] var pivot1Y = data[2*el2+1] var pivot2X = data[2*el4] var pivot2Y = data[2*el4+1] var ptr0 = 2 * el1; var ptr2 = 2 * el3; var ptr4 = 2 * el5; var ptr5 = 2 * index1; var ptr6 = 2 * index3; var ptr7 = 2 * index5; for (var i1 = 0; i1 < 2; ++i1) { var x = data[ptr0+i1]; var y = data[ptr2+i1]; var z = data[ptr4+i1]; data[ptr5+i1] = x; data[ptr6+i1] = y; data[ptr7+i1] = z; } move(index2, left, data) move(index4, right, data) for (var k = less; k <= great; ++k) { if (comparePivot(k, pivot1X, pivot1Y, data)) { if (k !== less) { swap(k, less, data) } ++less; } else { if (!comparePivot(k, pivot2X, pivot2Y, data)) { while (true) { if (!comparePivot(great, pivot2X, pivot2Y, data)) { if (--great < k) { break; } continue; } else { if (comparePivot(great, pivot1X, pivot1Y, data)) { rotate(k, less, great, data) ++less; --great; } else { swap(k, great, data) --great; } break; } } } } } shufflePivot(left, less-1, pivot1X, pivot1Y, data) shufflePivot(right, great+1, pivot2X, pivot2Y, data) if (less - 2 - left <= INSERT_SORT_CUTOFF) { insertionSort(left, less - 2, data); } else { quickSort(left, less - 2, data); } if (right - (great + 2) <= INSERT_SORT_CUTOFF) { insertionSort(great + 2, right, data); } else { quickSort(great + 2, right, data); } if (great - less <= INSERT_SORT_CUTOFF) { insertionSort(less, great, data); } else { quickSort(less, great, data); } }