Skip to content

Instantly share code, notes, and snippets.

@nicoptere
Last active August 29, 2015 14:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nicoptere/2fd0d4c16def636611dd to your computer and use it in GitHub Desktop.
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.
/*
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