Last active
August 29, 2015 14:08
-
-
Save nicoptere/2fd0d4c16def636611dd to your computer and use it in GitHub Desktop.
sorting triplets of floats in a buffer (vertices, indices, normals etc. ) using the QuickSort method.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
the quick sort method is described here : | |
http://antjanus.com/blog/web-development-tutorials/understanding-quicksort-js-native-implementation/ | |
*/ | |
function tripletSort( arr ) | |
{ | |
if (arr.length === 0)return []; | |
var left = []; | |
var right = []; | |
var p0 = arr[0], p1 = arr[1], p2 = arr[2]; | |
var v0, v1, v2; | |
for (var i = 3; i < arr.length; i+=3 ) | |
{ | |
v0 = arr[i]; | |
v1 = arr[i+1]; | |
v2 = arr[i+2]; | |
if( v0 <= p0 | |
&& v1 <= p1 | |
&& v2 <= p2 ) | |
{ | |
left.push( v0, v1, v2 ); | |
} | |
else | |
{ | |
right.push( v0, v1, v2 ); | |
} | |
} | |
return tripletSort( left ).concat( p0, p1, p2, tripletSort( right ) ); | |
} | |
///////////////////////////////////////////// | |
// + custom sort method | |
///////////////////////////////////////////// | |
function distance( a,b,c, d,e,f ) | |
{ | |
var d0 = a - d; | |
var d1 = b - e; | |
var d2 = c - f; | |
return d0*d0 + d1*d1 + d2*d2; | |
} | |
function distanceSort( arr, point, method ) | |
{ | |
if (arr.length === 0)return []; | |
var left = []; | |
var right = []; | |
var p0 = arr[0], p1 = arr[1], p2 = arr[2]; | |
var pivot = method( point[ 0 ], point[ 1 ], point[ 2 ], p0, p1, p2 ); | |
var v0, v1, v2; | |
for (var i = 3; i < arr.length; i+=3 ) | |
{ | |
v0 = arr[i]; | |
v1 = arr[i+1]; | |
v2 = arr[i+2]; | |
if( method( point[ 0 ], point[ 1 ], point[ 2 ], v0, v1, v2 ) < pivot ) | |
{ | |
left.push( v0, v1, v2 ); | |
} | |
else | |
{ | |
right.push( v0, v1, v2 ); | |
} | |
} | |
return distanceSort( left, point, method ).concat( p0, p1, p2, distanceSort( right, point, method ) ); | |
} | |
/////////////////////////////////////////// | |
// test | |
/////////////////////////////////////////// | |
var a = [ | |
4,40,4, | |
-2,2,2, | |
0,100,0, | |
1,10,-1, | |
-7,30,3 | |
]; | |
console.log( "unsorted array:\n", a ); | |
console.log( "--------------- \ntripletSort :" ); | |
console.log( tripletSort( a ) ); | |
var p = [ 0,0,0 ]; | |
console.log( "--------------- \ndistanceSort fomr point P:", p ); | |
console.log( distanceSort( a, p, distance ) ); | |
p = [45,45,45]; | |
console.log( "--------------- \ndistanceSort fomr point P:", p ); | |
console.log( distanceSort( a, p, distance ) ); | |
/* | |
expected result: | |
unsorted array: | |
[4, 40, 4, -2, 2, 2, 0, 100, 0, 1, 10, -1, -7, 30, 3] | |
--------------- | |
tripletSort : | |
[-2, 2, 2, 1, 10, -1, -7, 30, 3, 4, 40, 4, 0, 100, 0] | |
--------------- | |
distanceSort fomr point P: [0, 0, 0] | |
[-2, 2, 2, 1, 10, -1, -7, 30, 3, 4, 40, 4, 0, 100, 0] | |
--------------- | |
distanceSort fomr point P: [45, 45, 45] | |
[4, 40, 4, -7, 30, 3, 1, 10, -1, -2, 2, 2, 0, 100, 0] | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment