1 #include "mrilib.h"
2 
3 /*---------------------------------------------------------------
4    10 Jul 2001: sort a cluster by its "mag" array
5 -----------------------------------------------------------------*/
6 
7 typedef struct { short i, j, k; } short3 ;
8 
9 typedef struct { float v; short i, j, k; } fl_sh3 ;
10 
MCW_sort_cluster(MCW_cluster * cl)11 void MCW_sort_cluster( MCW_cluster *cl )
12 {
13    int nn , ii ;
14    float   *aa ;
15    short3 **ss ;
16 
17 ENTRY("MCW_sort_cluster") ;
18 
19    if( cl == NULL || cl->num_pt < 2 ) EXRETURN ;
20 
21    nn = cl->num_pt ;
22    aa = (float *  ) malloc(sizeof(float)   *nn) ;
23    ss = (short3 **) malloc(sizeof(short3 *)*nn) ;
24    for( ii=0 ; ii < nn ; ii++ ){
25       aa[ii]    = cl->mag[ii] ;
26       ss[ii]    = (short3 *) malloc(sizeof(short3)) ;
27       ss[ii]->i = cl->i[ii] ;
28       ss[ii]->j = cl->j[ii] ;
29       ss[ii]->k = cl->k[ii] ;
30    }
31 
32    qsort_floatstuff( nn , aa , (void **)ss ) ;
33 
34    for( ii=0 ; ii < nn ; ii++ ){
35       cl->mag[ii] = aa[ii] ;
36       cl->i[ii]   = ss[ii]->i ;
37       cl->j[ii]   = ss[ii]->j ;
38       cl->k[ii]   = ss[ii]->k ;
39       free(ss[ii]) ;
40    }
41 
42    free(ss) ; free(aa) ; EXRETURN ;
43 }
44 
45 /*----------------------------------------------------------------*/
46 /*! Sort a cluster by distance from (0,0,0) [e.g., a mask].
47 ------------------------------------------------------------------*/
48 
MCW_radsort_cluster(MCW_cluster * cl,float dx,float dy,float dz)49 void MCW_radsort_cluster( MCW_cluster *cl , float dx, float dy, float dz )
50 {
51    int nn , ii ;
52    float   *aa , x,y,z ;
53    fl_sh3 **ss ;
54 
55 ENTRY("MCW_radsort_cluster") ;
56 
57    if( cl == NULL || cl->num_pt < 2 ) EXRETURN ;
58 
59    if( dx == 0.0f ) dx = 1.0f ;
60    if( dy == 0.0f ) dy = 1.0f ;
61    if( dz == 0.0f ) dz = 1.0f ;
62 
63    nn = cl->num_pt ;
64    aa = (float *  ) malloc(sizeof(float)   *nn) ;
65    ss = (fl_sh3 **) malloc(sizeof(fl_sh3 *)*nn) ;
66    for( ii=0 ; ii < nn ; ii++ ){
67       x = cl->i[ii]*dx; y = cl->j[ii]*dy; z = cl->k[ii]*dz;
68       aa[ii]    = sqrt( x*x + y*y + z*z ) ;
69       ss[ii]    = (fl_sh3 *) malloc(sizeof(fl_sh3)) ;
70       ss[ii]->i = cl->i[ii] ;
71       ss[ii]->j = cl->j[ii] ;
72       ss[ii]->k = cl->k[ii] ;
73       ss[ii]->v = cl->mag[ii] ;
74    }
75 
76    qsort_floatstuff( nn , aa , (void **)ss ) ;
77 
78    for( ii=0 ; ii < nn ; ii++ ){
79       cl->mag[ii] = ss[ii]->v ;
80       cl->i[ii]   = ss[ii]->i ;
81       cl->j[ii]   = ss[ii]->j ;
82       cl->k[ii]   = ss[ii]->k ;
83       free(ss[ii]) ;
84    }
85 
86    free(ss) ; free(aa) ; EXRETURN ;
87 }
88