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