1 #ifndef SUMA_MISCFUNC_INCLUDED
2 #define SUMA_MISCFUNC_INCLUDED
3 
4 #define MATRIX_NO_TIP (1<<1)
5 #define MATRIX_OUT_SYMMETRIC (1<<2)
6 #define MATRIX_B_IS_AT (1<<2)
7 
8 /*!
9    A slimmed macro version of SUMA_nodesinsphere2
10 */
11 #define SUMA_NODESINSPHERE2(XYZ, nr, S_cent, S_dim , nodesin, nin) {\
12    static int m_k, m_nr3;  \
13    static float m_t0, m_t1, m_t2, m_d2, m_r2; \
14    m_k= nin = 0; \
15    m_nr3 = 3*nr;   \
16    m_r2 = S_dim*S_dim;  \
17    nin = 0; \
18    /*fprintf(SUMA_STDERR,"%s: inbound, center %f %f %f, dim %f\n", FuncName, *(S_cent), *((S_cent)+1), *((S_cent)+2), S_dim);   */\
19    while (m_k < m_nr3) {  \
20       /* relative distance to center */   \
21          m_t0 = SUMA_ABS((XYZ[m_k] - *(S_cent)));  ++m_k;   \
22          if (m_t0 <= S_dim) {  \
23             m_t1 = SUMA_ABS((XYZ[m_k] - *((S_cent)+1))); ++m_k;   \
24             if (m_t1 <= S_dim) {  \
25                m_t2 = SUMA_ABS((XYZ[m_k] - *((S_cent)+2))); ++m_k;   \
26                if (m_t2 <= S_dim) {  \
27                   /* in box, is it in sphere? */   \
28                   m_d2 = (m_t0*m_t0+m_t1*m_t1+m_t2*m_t2);   \
29                   if (m_d2 <=m_r2) {   \
30                      nodesin[nin] = m_k/3-1;  /* retreat by 1, increment already done */\
31                      ++nin;   \
32                   }  \
33                }  \
34             } else ++m_k;  \
35          } else m_k += 2;  \
36       }  \
37    }
38 
39 
40 double SUMA_factorial (int n);
41 double *SUMA_factorial_array (int n);
42 SUMA_MX_VEC *SUMA_KronProd(SUMA_MX_VEC *A, SUMA_MX_VEC *B);
43 float * SUMA_Sph2Cart (double *sph, int Nval, float *center ) ;
44 double * SUMA_Cart2Sph (float *coord, int Nval, float *center ) ;
45 void* SUMA_free_fn(const char *CallingFunc, void *ptr);
46 void *SUMA_calloc_fn (const char *CallingFunc, size_t nmemb, size_t size);
47 void *SUMA_malloc_fn (const char *CallingFunc, size_t size);
48 void *SUMA_realloc_fn (const char *CallingFunc, void *ptr, size_t size);
49 SUMA_MEMTRACE_STRUCT * SUMA_Create_MemTrace (void);
50 void SUMA_ShowMemTrace (SUMA_MEMTRACE_STRUCT *Mem, FILE *Out);
51 SUMA_Boolean SUMA_Free_MemTrace (SUMA_MEMTRACE_STRUCT * Mem);
52 void SUMA_alloc_problem (char *s1);
53 char **SUMA_allocate2D (int rows,int cols,int element_size);
54 void SUMA_free2D(char **a,int rows);
55 void SUMA_error_message (char *s1,char *s2,int ext);
56 char *SUMA_StringDiff(char *s1, char *s2);
57 char *SUMA_StringMatch(char *s1, char *s2, int firstdiff, char filler);
58 int SUMA_wordswap_ci ( const char *sbig, const char *ssub,
59                        const char *sswap, char *sout);
60 int SUMA_iswordin_ci (const char *sbig,const char *ssub);
61 int SUMA_iswordin (const char *sbig,const char *ssub);
62 int SUMA_iswordsame_ci (const char *sbig,const char *ssub);
63 int SUMA_iswordsame (const char *sbig,const char *ssub);
64 float SUMA_etime (struct  timeval  *t, int Report);
65 int SUMA_etime2(char *name, char *str, char *strloc);
66 char *SUMA_time(void);
67 char *SUMA_time_stamp(void);
68 byte * SUMA_isinpoly(float *P, float *NodeList, int *FaceSetList, int N_FaceSet,
69                      int FaceSetDim, int *dims, int *N_in, byte *usethis,
70                      byte *mask);
71 int is_in_wedge(float *P, float *C, float rr1, float rr2, float coshalpha,
72                 float *Q, float *uCP, float *rrQ, float *cosaQ);
73 SUMA_ISINBOX SUMA_isinbox (float * NodeList, int nr, float *S_cent ,
74                            float *S_dim , int BoundIn);
75 byte *SUMA_isinsphere_bm (float * NodeList, int nr, float *S_cent ,
76                           float S_rad , int BoundIn );
77 SUMA_Boolean SUMA_Free_IsInBox (SUMA_ISINBOX *IB);
78 SUMA_ISINSPHERE SUMA_isinsphere (float * NodeList, int nr, float *S_cent ,
79                                  float S_rad , int BoundIn);
80 
81 SUMA_Boolean SUMA_Free_IsInSphere (SUMA_ISINSPHERE *IB);
82 int SUMA_nodesinsphere2 (float *XYZ, int nr, float *S_cent ,
83                          float S_dim , int *nodesin, float *dinsq);
84 byte *SUMA_nodesinsphere2_bm (float * NodeList, int nr,
85                            float *S_cent , float S_rad,
86                            byte *bmu);
87 int SUMA_nodesinbox2 (float *XYZ, int nr, float *S_cent ,
88                       float *S_dim , int *nodesin, float *dinsq);
89 byte *SUMA_nodesinbox2_bm (float * NodeList, int nr,
90                         float *S_cent , float *S_edge,
91                         byte *bmu);
92 float **SUMA_Point_At_Distance(float *U, float *P1, float d);
93 double **SUMA_dPoint_At_Distance(double *U, double *P1, double d);
94 int SUMA_Point_To_Triangle_Distance (float *Points, int N_points,
95                                      float *P0, float *P1, float *P2,int itri,
96                                      float *tnorm,
97                                      float **distp, int **closestp, byte **sgnp,
98                                      byte city);
99 SUMA_Boolean SUMA_Shortest_Point_To_Triangles_Distance(
100          float *Points, int N_points,
101          float *NodeList, int *FaceSetList, int N_FaceSet,
102          float *FaceNormList,
103          float **distp, int **closestp, byte **sgnp,
104          byte city);
105 SUMA_Boolean SUMA_Point_To_Line_Distance (float *NodeList, int N_points, float *P1, float *P2, float *d2, float *d2min, int *i2min);
106 SUMA_Boolean SUMA_Point_To_Point_Distance (float *NodeList, int N_points, float *P1, float *d2, float *d2min, int *i2min);
107 int *SUMA_z_dqsort (int *x , int nx );
108 int *SUMA_z_dqsort_nsc (int *x , int nx );
109 int *SUMA_z_qsort (float *x , int nx );
110 int SUMA_compare_int (int *a, int *b );
111 int SUMA_compare_float (float *a, float *b );
112 int SUMA_compare_double (double *a, double *b );
113 void SUMA_disp_dmat (int **v,int nr, int nc , int SpcOpt);
114 void SUMA_disp_mat (float **v,int nr, int nc , int SpcOpt);
115 void SUMA_disp_vecmat (float *v,int nr, int nc , int SpcOpt,
116                         SUMA_INDEXING_ORDER d_order, FILE *fout,
117                         SUMA_Boolean AddRowInd);
118 void SUMA_disp_vecdmat (int *v,int nr, int nc , int SpcOpt,
119                         SUMA_INDEXING_ORDER d_order, FILE *fout,
120                         SUMA_Boolean AddRowInd);
121 void SUMA_disp_vecucmat (unsigned char *v,int nr, int nc , int SpcOpt,
122                         SUMA_INDEXING_ORDER d_order, FILE *fout,
123                         SUMA_Boolean AddRowInd);
124 void SUMA_disp_veccmat (char *v,int nr, int nc , int SpcOpt,
125                         SUMA_INDEXING_ORDER d_order, FILE *fout,
126                         SUMA_Boolean AddRowInd);
127 void SUMA_disp_vecdoubmat (double *v,int nr, int nc , int SpcOpt,
128                         SUMA_INDEXING_ORDER d_order, FILE *fout,
129                         SUMA_Boolean AddRowInd);
130 void SUMA_disp_veccompmat (complex *v,int nr, int nc , int SpcOpt,
131                         SUMA_INDEXING_ORDER d_order, FILE *fout,
132                         SUMA_Boolean AddRowInd);
133 void SUMA_disp_vecshortmat (short *v,int nr, int nc , int SpcOpt,
134                         SUMA_INDEXING_ORDER d_order, FILE *fout,
135                         SUMA_Boolean AddRowInd);
136 void SUMA_disp_vecbytemat (byte *v,int nr, int nc , int SpcOpt,
137                         SUMA_INDEXING_ORDER d_order, FILE *fout,
138                         SUMA_Boolean AddRowInd);
139 void SUMA_disp_dvect (int *v,int l);
140 void SUMA_disp_vect (float *v,int l);
141 void SUMA_disp_doubvect (double *v,int l);
142 int SUMA_WriteMxVec(SUMA_MX_VEC *mxv, char *Name, char *title);
143 void SUMA_Set_VoxIntersDbg(int v);
144 SUMA_Boolean SUMA_isVoxelIntersect_Triangle (float *center, float *dxzy,
145                                              float *vert0, float *vert1,
146                                              float *vert2);
147 SUMA_Boolean SUMA_MT_count_intersect_triangle(void *v0, void *v1,
148                            float *NodeList, int N_Node,
149                            int *FaceSetList, int N_FaceSet,
150                            int *N_hits, int *tris_hit,
151                            byte OnlyBetween, byte *nmask,
152                            int input_are_indices,
153                            float *min_dist, int *iface_min_dist, float *proj);
154 SUMA_Boolean SUMA_MT_isIntersect_Triangle (
155       float *P0, float *P1,
156       float *vert0, float *vert1, float *vert2,
157       float *iP, float *d, int *closest_vert);
158 SUMA_MT_INTERSECT_TRIANGLE *SUMA_MT_intersect_triangle(
159       float *P0, float *P1,
160       float *NodeList, int N_Node,
161       int *FaceSetList, int N_FaceSet,
162       SUMA_MT_INTERSECT_TRIANGLE * PrevMTI, int posonly);
163 void * SUMA_Free_MT_intersect_triangle(SUMA_MT_INTERSECT_TRIANGLE *MTI);
164 SUMA_Boolean SUMA_Show_MT_intersect_triangle(SUMA_MT_INTERSECT_TRIANGLE *MTI,
165                                              FILE *Out, char *preamble);
166 SUMA_Boolean	SUMA_mattoquat (float **mat, float *q);
167 SUMA_Boolean SUMA_FromToRotation (float *v0, float *v1, float **mtx);
168 int * SUMA_fqsortrow (float **X , int nr, int nc  );
169 int * SUMA_dqsortrow (int **X , int nr, int nc  );
170 int *SUMA_z_doubqsort (double *x , int nx );
171 int SUMA_float_file_size (char *f_name);
172 int SUMA_Read_2Dfile (char *f_name, float **x,  int n_rows, int n_cols);
173 int SUMA_Read_2Ddfile (char *f_name, int **x, int n_rows, int n_cols);
174 SUMA_Boolean SUMA_MakeConsistent (int *FaceSetList, int N_FaceSet, SUMA_EDGE_LIST *SEL, int detail, int *trouble);
175 SUMA_EDGE_LIST * SUMA_Make_Edge_List (int *FaceSetList, int N_FaceSet, int N_Node, float *NodeList, char *ownerid);
176 SUMA_EDGE_LIST * SUMA_Make_Edge_List_eng (int *FaceSetList, int N_FaceSet, int N_Node, float *NodeList, int debug, char *ownerid);
177 void SUMA_free_Edge_List (SUMA_EDGE_LIST *SEL);
178 int SUMA_isConsistent (int *T, int *t);
179 int SUMA_isTriLinked (int*T, int *t, int *cn);
180 SUMA_FACESET_FIRST_EDGE_NEIGHB *SUMA_allocate_FaceSet_Edge_Neighb(int N_FaceSet);
181 SUMA_FACESET_FIRST_EDGE_NEIGHB *SUMA_FaceSet_Edge_Neighb (int **EL, int **ELps,
182                                                           int N_EL);
183 float * SUMA_SmoothAttr_Neighb (float *attr,  int N_attr, float *attr_sm,
184                                 SUMA_NODE_FIRST_NEIGHB *fn, int nr, byte *nmask,
185                                 byte strict_mask);
186 float * SUMA_SmoothAttr_Neighb_wght (float *attr, int N_attr, float *wght,
187                                      float *attr_sm, SUMA_NODE_FIRST_NEIGHB *fn,
188                                      int nr, byte *nmask, byte strict_mask);
189 float * SUMA_SmoothAttr_Neighb_Rec (float *attr, int N_attr,
190                                     float *attr_sm_orig,
191                                     SUMA_NODE_FIRST_NEIGHB *fn,
192                                     int nr, int N_rep,
193                                     byte *nmask, byte strict_mask);
194 SUMA_NODE_FIRST_NEIGHB * SUMA_Build_FirstNeighb (
195                            SUMA_EDGE_LIST *el, int N_Node,
196                            char *ownerid, int verb);
197 SUMA_Boolean SUMA_Free_FirstNeighb (SUMA_NODE_FIRST_NEIGHB *FN);
198 float * SUMA_PolySurf3 (float *NodeList, int N_Node, int *FaceSetList, int N_FaceSet, int PolyDim, float *FaceNormList, SUMA_Boolean SignedArea);
199 float SUMA_TriSurf3 (float *n0, float *n1, float *n2);
200 float * SUMA_TriSurf3v (float *NodeList, int *FaceSets, int N_FaceSet);
201 SUMA_Boolean SUMA_TriNorm (float *n0, float *n1, float *n2, float *norm);
202 SUMA_SURFACE_CURVATURE * SUMA_Surface_Curvature (float *NodeList, int N_Node,
203                      float *NodeNormList, float *Face_A, int N_FaceSet,
204                      SUMA_NODE_FIRST_NEIGHB *FN, SUMA_EDGE_LIST *el,
205                      char *out, int verb);
206 SUMA_DSET *SUMA_CurvatureToDset(SUMA_SURFACE_CURVATURE *SC, char *OutPrefix);
207 SUMA_Boolean SUMA_Householder (float *Ni, float **Q);
208 void SUMA_Free_SURFACE_CURVATURE (SUMA_SURFACE_CURVATURE *SC);
209 float * SUMA_Convexity (float *NodeList, int N_Node, float *NodeNormList,
210                         SUMA_NODE_FIRST_NEIGHB *FN, float *usethis);
211 float * SUMA_Convexity_Engine (float *NodeList, int N_Node, float *NodeNormList,
212                      SUMA_NODE_FIRST_NEIGHB *FN, char *Fname, float *usethis);
213 int SUMA_Read_file (float *x,char *f_name,int n_points);
214 int SUMA_Read_dfile (int *x,char *f_name,int n_points);
215 char * SUMA_pad_str ( char *str, char pad_val , int pad_ln , int opt);
216 char SUMA_ReadCharStdin (char def, int case_sensitive, char *allowed);
217 int SUMA_ReadNumStdin (float *fv, int nv);
218 int * SUMA_Find_inIntVect (int *x, int xsz, int val, int *nValLocation);
219 int SUMA_FindFirst_inIntVect (int *x0, int *x1, int val);
220 int * SUMA_UniqueInt (int *y, int xsz, int *kunq, int Sorted );
221 int * SUMA_UniqueInt_ind (int *ys, int N_y, int *kunq, int **iup);
222 void SUMA_Show_Edge_List (SUMA_EDGE_LIST *SEL, FILE *Out);
223 int SUMA_FindEdge (SUMA_EDGE_LIST *EL, int n1, int n2);
224 int SUMA_FindEdgeInTri (SUMA_EDGE_LIST *EL, int n1, int n2, int Tri);
225 int SUMA_whichTri (SUMA_EDGE_LIST * EL, int n1, int n2, int n3, int IOtrace,
226                      byte quiet);
227 int SUMA_whichTri_e (SUMA_EDGE_LIST * EL, int E1, int E2, int IOtrace,
228                      byte quiet);
229 SUMA_Boolean SUMA_Get_Incident(int n1, int n2, SUMA_EDGE_LIST *SEL, int *Incident, int *N_Incident, int IOtrace, byte quiet);
230 SUMA_Boolean SUMA_Get_NodeIncident(int n1, SUMA_SurfaceObject *SO, int *Incident, int *N_Incident);
231 SUMA_IRGB *SUMA_Free_IRGB(SUMA_IRGB *irgb);
232 SUMA_IRGB *SUMA_Read_IRGB_file (char *f_name);
233 SUMA_IRGB *SUMA_Create_IRGB(int n_el);
234 SUMA_MX_VEC * SUMA_MxVecSetIdentity(SUMA_MX_VEC *thisone);
235 SUMA_MX_VEC * SUMA_MxVecIdentity(SUMA_VARTYPE tp, int n, int dims[], SUMA_MX_VEC *recycle);
236 SUMA_MX_VEC *SUMA_MxVecMult(SUMA_MX_VEC *va, SUMA_MX_VEC *vb, SUMA_MX_VEC *recycle, int InfoMask);
237 SUMA_MX_VEC *SUMA_MxVecMult_Engine(SUMA_MX_VEC *va, SUMA_MX_VEC *vb, SUMA_MX_VEC *recycle, SUMA_MX_VEC *vat, SUMA_MX_VEC *vbt, int InfoMask);
238 SUMA_MX_VEC *SUMA_MxVecMultRect_Engine(SUMA_MX_VEC *va, SUMA_MX_VEC *vb, SUMA_MX_VEC *recycle, SUMA_MX_VEC *vat, SUMA_MX_VEC *vbt, int InfoMask);
239 SUMA_MX_VEC * SUMA_MxVecTranspose(SUMA_MX_VEC *va, SUMA_MX_VEC *recycle);
240 SUMA_MX_VEC * SUMA_MxVecInverse(SUMA_MX_VEC *va, SUMA_MX_VEC *recycle);
241 SUMA_MX_VEC *SUMA_matrix2MxVec(matrix c) ;
242 SUMA_MX_VEC *SUMA_MxVecAdd(SUMA_MX_VEC *va, SUMA_MX_VEC *vb, int sign, SUMA_MX_VEC *recycle);
243 SUMA_MX_VEC * SUMA_MxVecCopy(SUMA_MX_VEC *va, SUMA_MX_VEC *recycle);
244 int SUMA_MxVecSameDims(SUMA_MX_VEC *va,SUMA_MX_VEC *vb);
245 int SUMA_MxVecSameDims2(int N_dims, int *dims, SUMA_MX_VEC *va);
246 SUMA_MX_VEC *SUMA_CoerceMxVec(SUMA_MX_VEC *va, SUMA_VARTYPE tp, int abs, SUMA_MX_VEC *recycle);
247 int SUMA_MxVecBuildMat(SUMA_MX_VEC *mxv);
248 void SUMA_TestMxVecMatOps(void);
249 SUMA_MX_VEC * SUMA_MxVecRand(SUMA_VARTYPE tp, int N_dims,int * dims, SUMA_MX_VEC *recycle);
250 SUMA_MX_VEC *  SUMA_Read1DMxVec(SUMA_VARTYPE tp, char *Name, int *dims, int *N_dims);
251 
252 void SUMA_ShowFromTo(char *f, char *t, char *head);
253 int SUMA_LineNumbersFromTo(char *f, char *t);
254 int SUMA_makepow2(int val);
255 
256 
257 #endif
258 
259