Code:
init()
{
count = 6;
radius = 100;
verts = [];
//create a convex poly
for( i = 0 ; i < count ; i++ )
{
angle = 360 / count * i;
verts[i] = ( radius * cos( angle ) , radius * sin( angle ) , 0 );
}
order = [];
//assign the order
for( i = 0 ; i < verts.size ; i++ )
{
order[i] = i;
}
//shuffle them
for( i = 0 ; i < order.size ; i++ )
{
j = randomInt( order.size );
t = order[i];
order[i] = order[j];
order[j] = t;
}
//show unsortedorder
s = "\n";
for( i = 0 ; i < order.size ; i++ )
{
s += ( "order[" + i + "] = " + order[i] + "\n" );
}
debug( s );
//get the center
center = calculatePolyCenter( verts );
//sort the vertices
order = sortVertsOnPoly( verts , center );
//show sorted order
s = "\n";
for( i = 0 ; i < verts.size ; i++ )
{
s += ( "sorted order[" + i + "] = " + order[i] + "\n" );
}
debug( s );
}
sortVertsOnPoly( verts , center )
{
idx = [];
idx[0] = 0;
dirs = [];
dirs[0] = 0;
dir = vectorNormalize( verts[0] - center );
for( i = 1 ; i < verts.size ; i++ )//i should use arctan(y/x) instead here... need abit time to think about it...
{
dot = vectorDot( dir , vectorNormalize( verts[i] - center ) );
if( dot < 0 )
dirs[i] = 360 - aCos( dot );
else
dirs[i] = aCos( dot );
idx[i] = i;
}
swapped = true;
for( j = 1 ; swapped ; j++ )
{
swapped = false;
for( i = 0 ; i < dirs.size - j ; i++ )
{
if( dirs[i] > dirs[i + 1] )
{
t = dirs[i];
dirs[i] = dirs[i + 1];
dirs[i + 1] = t;
t = idx[i];
idx[i] = idx[i + 1];
idx[i + 1] = t;
swapped = true;
}
}
}
return idx;
}
calculatePolyCenter( verts )
{
center = ( 0 , 0 , 0 );
for( i = 0 ; i < verts.size ; i++ )
{
center += verts[i];
}
return vectorScale( center , 1 / verts.size );
}
vectorScale( v , s )
{
return ( v[0] * s , v[1] * s , v[2] * s );
}
debug( x )
{
iPrintLn( "debug: " + x );
}