static void vsortq( ObjectDB *odb ) { static int stack[ 200 ]; int i, j, lt, rt, tos = -1, t, key = KEY, ipos = IPOS; float v; lt = 0; rt = ARRAYSIZE - 1; for ( ;; ) { while ( rt - lt > SUBARRAYSIZE ) { v = SORTVAL( rt ); i = lt - 1; j = rt; for ( ;; ) { while ( SORTVAL( ++i ) < v ) ; while ( j && SORTVAL( --j ) > v ) ; if ( i > j ) break; SWAP( ARRAY( i ), ARRAY( j )); } SWAP( ARRAY( i ), ARRAY( rt )); if ( i - lt > rt - i ) { PUSH( lt ); PUSH( i - 1 ); lt = i + 1; } else { PUSH( i + 1 ); PUSH( rt ); rt = i - 1; } } if ( STACKEMPTY ) break; POP( rt ); POP( lt ); } }
static void vsorti( ObjectDB *odb ) { int i, j, t, key = KEY, ipos = IPOS; float v; for ( i = 1; i < ARRAYSIZE; i++ ) { t = ARRAY( i ); v = SORTVAL( i ); j = i; while ( j && SORTVAL( j - 1 ) > v ) { ARRAY( j ) = ARRAY( j - 1 ); --j; } ARRAY( j ) = t; } }
int pointSearch( ObjectDB *odb, float pos[ 3 ] ) { int lt = 0, rt = ARRAYSIZE - 1, x, key = KEY, ipos = IPOS; while ( rt >= lt ) { x = ( lt + rt ) / 2; if ( pos[ key ] < SORTVAL( x )) rt = x - 1; else lt = x + 1; if ( pos[ key ] == SORTVAL( x )) { lt = rt = x; while ( lt > 0 && pos[ key ] == SORTVAL( lt - 1 )) --lt; while ( rt < ARRAYSIZE - 1 && pos[ key ] == SORTVAL( rt + 1 )) ++rt; for ( x = lt; x <= rt; x++ ) if ( pos[ 0 ] == COORD( x, 0 ) && pos[ 1 ] == COORD( x, 1 ) && pos[ 2 ] == COORD( x, 2 )) return ARRAY( x ); return -1; } } return -1; }
void Dbg_util_edge_out(Rt_map *clmp, Rt_map *dlmp) { if (DBG_NOTCLASS(DBG_C_INIT)) return; if (DBG_NOTDETAIL()) return; dbg_print(LIST(clmp), MSG_INTL(MSG_UTL_EDGE_OUT), SORTVAL(clmp), NAME(clmp), NAME(dlmp)); }