File: | src/gage/sclanswer.c |
Location: | line 226, column 7 |
Description: | Value stored to 'pness' is never read |
1 | /* |
2 | Teem: Tools to process and visualize scientific data and images . |
3 | Copyright (C) 2013, 2012, 2011, 2010, 2009 University of Chicago |
4 | Copyright (C) 2008, 2007, 2006, 2005 Gordon Kindlmann |
5 | Copyright (C) 2004, 2003, 2002, 2001, 2000, 1999, 1998 University of Utah |
6 | |
7 | This library is free software; you can redistribute it and/or |
8 | modify it under the terms of the GNU Lesser General Public License |
9 | (LGPL) as published by the Free Software Foundation; either |
10 | version 2.1 of the License, or (at your option) any later version. |
11 | The terms of redistributing and/or modifying this software also |
12 | include exceptions to the LGPL that facilitate static linking. |
13 | |
14 | This library is distributed in the hope that it will be useful, |
15 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
17 | Lesser General Public License for more details. |
18 | |
19 | You should have received a copy of the GNU Lesser General Public License |
20 | along with this library; if not, write to Free Software Foundation, Inc., |
21 | 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
22 | */ |
23 | |
24 | #include "gage.h" |
25 | #include "privateGage.h" |
26 | |
27 | /* HEY copied from ten.h */ |
28 | #define TEN_M2T(t, m) ( \ |
29 | (t)[1] = (m)[0], \ |
30 | (t)[2] = ((m)[1]+(m)[3])/2.0, \ |
31 | (t)[3] = ((m)[2]+(m)[6])/2.0, \ |
32 | (t)[4] = (m)[4], \ |
33 | (t)[5] = ((m)[5]+(m)[7])/2.0, \ |
34 | (t)[6] = (m)[8]) |
35 | #define TEN_T_SCALE(a, s, b) ( \ |
36 | (a)[0] = (b)[0], \ |
37 | (a)[1] = (s)*(b)[1], \ |
38 | (a)[2] = (s)*(b)[2], \ |
39 | (a)[3] = (s)*(b)[3], \ |
40 | (a)[4] = (s)*(b)[4], \ |
41 | (a)[5] = (s)*(b)[5], \ |
42 | (a)[6] = (s)*(b)[6]) |
43 | |
44 | void |
45 | _gageSclAnswer(gageContext *ctx, gagePerVolume *pvl) { |
46 | char me[]="_gageSclAnswer"; |
47 | double gmag=0, *hess, *norm, *gvec, *gten, *k1, *k2, curv=0, |
48 | sHess[9]={0,0,0,0,0,0,0,0,0}; |
49 | double tmpMat[9], tmpVec[3], hevec[9], heval[3]; |
50 | double len, gp1[3], gp2[3], *nPerp, ncTen[9], nProj[9]={0,0,0,0,0,0,0,0,0}; |
51 | double alpha = 0.5; |
52 | double beta = 0.5; |
53 | double _gamma = 5; |
54 | double cc = 1e-6; |
55 | #define FD_MEDIAN_MAX16 16 |
56 | int fd, nidx, xi, yi, zi; |
57 | double *fw, iv3wght[2*FD_MEDIAN_MAX16*FD_MEDIAN_MAX16*FD_MEDIAN_MAX16], |
58 | wghtSum, wght; |
59 | |
60 | /* convenience pointers for work below */ |
61 | hess = pvl->directAnswer[gageSclHessian]; |
62 | gvec = pvl->directAnswer[gageSclGradVec]; |
63 | norm = pvl->directAnswer[gageSclNormal]; |
64 | nPerp = pvl->directAnswer[gageSclNPerp]; |
65 | gten = pvl->directAnswer[gageSclGeomTens]; |
66 | k1 = pvl->directAnswer[gageSclK1]; |
67 | k2 = pvl->directAnswer[gageSclK2]; |
68 | |
69 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclValue)(pvl->query[gageSclValue/8] & (1 << (gageSclValue % 8)))) { |
70 | /* done if doV */ |
71 | if (ctx->verbose > 2) { |
72 | fprintf(stderr__stderrp, "%s: val = % 15.7f\n", me, |
73 | (double)(pvl->directAnswer[gageSclValue][0])); |
74 | } |
75 | } |
76 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclGradVec)(pvl->query[gageSclGradVec/8] & (1 << (gageSclGradVec % 8)))) { |
77 | /* done if doD1 */ |
78 | if (ctx->verbose > 2) { |
79 | fprintf(stderr__stderrp, "%s: gvec = ", me); |
80 | ell_3v_print_d(stderr__stderrp, gvec); |
81 | } |
82 | } |
83 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclGradMag)(pvl->query[gageSclGradMag/8] & (1 << (gageSclGradMag % 8)))) { |
84 | /* this is the true value of gradient magnitude */ |
85 | gmag = pvl->directAnswer[gageSclGradMag][0] = sqrt(ELL_3V_DOT(gvec, gvec)((gvec)[0]*(gvec)[0] + (gvec)[1]*(gvec)[1] + (gvec)[2]*(gvec) [2])); |
86 | } |
87 | |
88 | /* NB: it would seem that gageParmGradMagMin is completely ignored . . . */ |
89 | |
90 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclNormal)(pvl->query[gageSclNormal/8] & (1 << (gageSclNormal % 8)))) { |
91 | if (gmag) { |
92 | ELL_3V_SCALE(norm, 1/gmag, gvec)((norm)[0] = (1/gmag)*(gvec)[0], (norm)[1] = (1/gmag)*(gvec)[ 1], (norm)[2] = (1/gmag)*(gvec)[2]); |
93 | /* polishing |
94 | len = sqrt(ELL_3V_DOT(norm, norm)); |
95 | ELL_3V_SCALE(norm, 1/len, norm); |
96 | */ |
97 | } else { |
98 | ELL_3V_COPY(norm, gageZeroNormal)((norm)[0] = (gageZeroNormal)[0], (norm)[1] = (gageZeroNormal )[1], (norm)[2] = (gageZeroNormal)[2]); |
99 | } |
100 | } |
101 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclNProj)(pvl->query[gageSclNProj/8] & (1 << (gageSclNProj % 8)))) { |
102 | ELL_3MV_OUTER(pvl->directAnswer[gageSclNProj], norm, norm)((((pvl->directAnswer[gageSclNProj])+0)[0] = ((norm)[0])*( (norm))[0], ((pvl->directAnswer[gageSclNProj])+0)[1] = ((norm )[0])*((norm))[1], ((pvl->directAnswer[gageSclNProj])+0)[2 ] = ((norm)[0])*((norm))[2]), (((pvl->directAnswer[gageSclNProj ])+3)[0] = ((norm)[1])*((norm))[0], ((pvl->directAnswer[gageSclNProj ])+3)[1] = ((norm)[1])*((norm))[1], ((pvl->directAnswer[gageSclNProj ])+3)[2] = ((norm)[1])*((norm))[2]), (((pvl->directAnswer[ gageSclNProj])+6)[0] = ((norm)[2])*((norm))[0], ((pvl->directAnswer [gageSclNProj])+6)[1] = ((norm)[2])*((norm))[1], ((pvl->directAnswer [gageSclNProj])+6)[2] = ((norm)[2])*((norm))[2])); |
103 | } |
104 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclNPerp)(pvl->query[gageSclNPerp/8] & (1 << (gageSclNPerp % 8)))) { |
105 | /* nPerp = I - outer(norm, norm) */ |
106 | /* NB: this sets both nPerp and nProj */ |
107 | ELL_3MV_OUTER(nProj, norm, norm)((((nProj)+0)[0] = ((norm)[0])*((norm))[0], ((nProj)+0)[1] = ( (norm)[0])*((norm))[1], ((nProj)+0)[2] = ((norm)[0])*((norm)) [2]), (((nProj)+3)[0] = ((norm)[1])*((norm))[0], ((nProj)+3)[ 1] = ((norm)[1])*((norm))[1], ((nProj)+3)[2] = ((norm)[1])*(( norm))[2]), (((nProj)+6)[0] = ((norm)[2])*((norm))[0], ((nProj )+6)[1] = ((norm)[2])*((norm))[1], ((nProj)+6)[2] = ((norm)[2 ])*((norm))[2])); |
108 | ELL_3M_SCALE(nPerp, -1, nProj)((((nPerp)+0)[0] = ((-1))*((nProj)+0)[0], ((nPerp)+0)[1] = (( -1))*((nProj)+0)[1], ((nPerp)+0)[2] = ((-1))*((nProj)+0)[2]), (((nPerp)+3)[0] = ((-1))*((nProj)+3)[0], ((nPerp)+3)[1] = (( -1))*((nProj)+3)[1], ((nPerp)+3)[2] = ((-1))*((nProj)+3)[2]), (((nPerp)+6)[0] = ((-1))*((nProj)+6)[0], ((nPerp)+6)[1] = (( -1))*((nProj)+6)[1], ((nPerp)+6)[2] = ((-1))*((nProj)+6)[2])); |
109 | nPerp[0] += 1; |
110 | nPerp[4] += 1; |
111 | nPerp[8] += 1; |
112 | } |
113 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclHessian)(pvl->query[gageSclHessian/8] & (1 << (gageSclHessian % 8)))) { |
114 | /* done if doD2 */ |
115 | if (ctx->verbose > 2) { |
116 | fprintf(stderr__stderrp, "%s: hess = \n", me); |
117 | ell_3m_print_d(stderr__stderrp, hess); |
118 | } |
119 | } |
120 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclHessianTen)(pvl->query[gageSclHessianTen/8] & (1 << (gageSclHessianTen % 8)))) { |
121 | pvl->directAnswer[gageSclHessianTen][0] = 1.0; |
122 | TEN_M2T(pvl->directAnswer[gageSclHessianTen], |
123 | pvl->directAnswer[gageSclHessian]); |
124 | } |
125 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclLaplacian)(pvl->query[gageSclLaplacian/8] & (1 << (gageSclLaplacian % 8)))) { |
126 | pvl->directAnswer[gageSclLaplacian][0] = hess[0] + hess[4] + hess[8]; |
127 | if (ctx->verbose > 2) { |
128 | fprintf(stderr__stderrp, "%s: lapl = %g + %g + %g = %g\n", me, |
129 | hess[0], hess[4], hess[8], |
130 | pvl->directAnswer[gageSclLaplacian][0]); |
131 | } |
132 | } |
133 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclHessFrob)(pvl->query[gageSclHessFrob/8] & (1 << (gageSclHessFrob % 8)))) { |
134 | pvl->directAnswer[gageSclHessFrob][0] = ELL_3M_FROB(hess)(sqrt((((hess)+0)[0]*((hess)+0)[0] + ((hess)+0)[1]*((hess)+0) [1] + ((hess)+0)[2]*((hess)+0)[2]) + (((hess)+3)[0]*((hess)+3 )[0] + ((hess)+3)[1]*((hess)+3)[1] + ((hess)+3)[2]*((hess)+3) [2]) + (((hess)+6)[0]*((hess)+6)[0] + ((hess)+6)[1]*((hess)+6 )[1] + ((hess)+6)[2]*((hess)+6)[2]))); |
135 | } |
136 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclHessEval)(pvl->query[gageSclHessEval/8] & (1 << (gageSclHessEval % 8)))) { |
137 | if (ctx->parm.twoDimZeroZ) { |
138 | ell_3m2sub_eigensolve_d(heval, hevec, hess); |
139 | } else { |
140 | /* HEY: look at the return value for root multiplicity? */ |
141 | ell_3m_eigensolve_d(heval, hevec, hess, AIR_TRUE1); |
142 | } |
143 | ELL_3V_COPY(pvl->directAnswer[gageSclHessEval], heval)((pvl->directAnswer[gageSclHessEval])[0] = (heval)[0], (pvl ->directAnswer[gageSclHessEval])[1] = (heval)[1], (pvl-> directAnswer[gageSclHessEval])[2] = (heval)[2]); |
144 | } |
145 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclHessEvec)(pvl->query[gageSclHessEvec/8] & (1 << (gageSclHessEvec % 8)))) { |
146 | ELL_3M_COPY(pvl->directAnswer[gageSclHessEvec], hevec)((((pvl->directAnswer[gageSclHessEvec])+0)[0] = ((hevec)+0 )[0], ((pvl->directAnswer[gageSclHessEvec])+0)[1] = ((hevec )+0)[1], ((pvl->directAnswer[gageSclHessEvec])+0)[2] = ((hevec )+0)[2]), (((pvl->directAnswer[gageSclHessEvec])+3)[0] = ( (hevec)+3)[0], ((pvl->directAnswer[gageSclHessEvec])+3)[1] = ((hevec)+3)[1], ((pvl->directAnswer[gageSclHessEvec])+3 )[2] = ((hevec)+3)[2]), (((pvl->directAnswer[gageSclHessEvec ])+6)[0] = ((hevec)+6)[0], ((pvl->directAnswer[gageSclHessEvec ])+6)[1] = ((hevec)+6)[1], ((pvl->directAnswer[gageSclHessEvec ])+6)[2] = ((hevec)+6)[2])); |
147 | } |
148 | #if 1 |
149 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclHessRidgeness)(pvl->query[gageSclHessRidgeness/8] & (1 << (gageSclHessRidgeness % 8)))) { |
150 | double A, B, S; |
151 | if (heval[1] >0 || heval[2]>0) { |
152 | pvl->directAnswer[gageSclHessRidgeness][0] = 0; |
153 | } |
154 | else if (AIR_ABS(heval[1])((heval[1]) > 0.0f ? (heval[1]) : -(heval[1]))<1e-10 || AIR_ABS(heval[2])((heval[2]) > 0.0f ? (heval[2]) : -(heval[2]))<1e-10) { |
155 | pvl->directAnswer[gageSclHessRidgeness][0] = 0; |
156 | } |
157 | else { |
158 | double *ans; |
159 | A = AIR_ABS(heval[1])((heval[1]) > 0.0f ? (heval[1]) : -(heval[1]))/AIR_ABS(heval[2])((heval[2]) > 0.0f ? (heval[2]) : -(heval[2])); |
160 | B = AIR_ABS(heval[0])((heval[0]) > 0.0f ? (heval[0]) : -(heval[0]))/sqrt(AIR_ABS(heval[1]*heval[2])((heval[1]*heval[2]) > 0.0f ? (heval[1]*heval[2]) : -(heval [1]*heval[2]))); |
161 | S = sqrt(heval[0]*heval[0] + heval[1]*heval[1] + heval[2]*heval[2]); |
162 | ans = pvl->directAnswer[gageSclHessRidgeness]; |
163 | ans[0] = (1-exp(-A*A/(2*alpha*alpha))) * |
164 | exp(-B*B/(2*beta*beta)) * |
165 | (1-exp(-S*S/(2*_gamma*_gamma))) * |
166 | exp(-2*cc*cc/(AIR_ABS(heval[1])((heval[1]) > 0.0f ? (heval[1]) : -(heval[1]))*heval[2]*heval[2])); |
167 | } |
168 | } |
169 | #else |
170 | /* alternative implementation by GLK, based on directly following |
171 | Frangi text. Only significant difference from above is a |
172 | discontinuity at heval[0] = -heval[1] */ |
173 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclHessRidgeness)(pvl->query[gageSclHessRidgeness/8] & (1 << (gageSclHessRidgeness % 8)))) { |
174 | double ev[4], tmp; |
175 | ELL_3V_COPY(ev+1, heval)((ev+1)[0] = (heval)[0], (ev+1)[1] = (heval)[1], (ev+1)[2] = ( heval)[2]); |
176 | if (AIR_ABS(ev[2])((ev[2]) > 0.0f ? (ev[2]) : -(ev[2])) > AIR_ABS(ev[3])((ev[3]) > 0.0f ? (ev[3]) : -(ev[3]))) { ELL_SWAP2(ev[2], ev[3], tmp)((tmp)=(ev[2]),(ev[2])=(ev[3]),(ev[3])=(tmp)); } |
177 | if (AIR_ABS(ev[1])((ev[1]) > 0.0f ? (ev[1]) : -(ev[1])) > AIR_ABS(ev[2])((ev[2]) > 0.0f ? (ev[2]) : -(ev[2]))) { ELL_SWAP2(ev[1], ev[2], tmp)((tmp)=(ev[1]),(ev[1])=(ev[2]),(ev[2])=(tmp)); } |
178 | if (AIR_ABS(ev[2])((ev[2]) > 0.0f ? (ev[2]) : -(ev[2])) > AIR_ABS(ev[3])((ev[3]) > 0.0f ? (ev[3]) : -(ev[3]))) { ELL_SWAP2(ev[2], ev[3], tmp)((tmp)=(ev[2]),(ev[2])=(ev[3]),(ev[3])=(tmp)); } |
179 | if (ev[2] > 0 || ev[3] > 0) { |
180 | pvl->directAnswer[gageSclHessRidgeness][0] = 0; |
181 | } else { |
182 | double a1, a2, a3, RB, RA, SS, fa, fb, fg, aa, bb, gg, frangi; |
183 | a1 = AIR_ABS(ev[1])((ev[1]) > 0.0f ? (ev[1]) : -(ev[1])); |
184 | a2 = AIR_ABS(ev[2])((ev[2]) > 0.0f ? (ev[2]) : -(ev[2])); |
185 | a3 = AIR_ABS(ev[3])((ev[3]) > 0.0f ? (ev[3]) : -(ev[3])); |
186 | RB = a1/sqrt(a2*a3); |
187 | RA = a2/a3; |
188 | SS = sqrt(a1*a1 + a2*a2 + a3*a3); |
189 | aa = bb = 0.5; |
190 | gg = 1; |
191 | fa = 1 - exp(-RA*RA/(2*aa*aa)); |
192 | fb = exp(-RB*RB/(2*bb*bb)); |
193 | fg = 1 - exp(-SS*SS/(2*gg*gg)); |
194 | frangi = fa*fb*fg; |
195 | if (!AIR_EXISTS(frangi)(((int)(!((frangi) - (frangi)))))) { frangi = 0.0; } |
196 | pvl->directAnswer[gageSclHessRidgeness][0] = frangi; |
197 | } |
198 | } |
199 | #endif |
200 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclHessValleyness)(pvl->query[gageSclHessValleyness/8] & (1 << (gageSclHessValleyness % 8)))) { |
201 | double A, B, S; |
202 | if (heval[0] <0 || heval[1]<0) { |
203 | pvl->directAnswer[gageSclHessValleyness][0] = 0; |
204 | } |
205 | else if (AIR_ABS(heval[0])((heval[0]) > 0.0f ? (heval[0]) : -(heval[0]))<1e-10 || AIR_ABS(heval[1])((heval[1]) > 0.0f ? (heval[1]) : -(heval[1]))<1e-10) { |
206 | pvl->directAnswer[gageSclHessValleyness][0] = 0; |
207 | } |
208 | else { |
209 | double *ans; |
210 | A = AIR_ABS(heval[1])((heval[1]) > 0.0f ? (heval[1]) : -(heval[1]))/AIR_ABS(heval[0])((heval[0]) > 0.0f ? (heval[0]) : -(heval[0])); |
211 | B = AIR_ABS(heval[2])((heval[2]) > 0.0f ? (heval[2]) : -(heval[2]))/sqrt(AIR_ABS(heval[1]*heval[0])((heval[1]*heval[0]) > 0.0f ? (heval[1]*heval[0]) : -(heval [1]*heval[0]))); |
212 | S = sqrt(heval[0]*heval[0] + heval[1]*heval[1] + heval[2]*heval[2]); |
213 | ans = pvl->directAnswer[gageSclHessValleyness]; |
214 | ans[0] = (1-exp(-A*A/(2*alpha*alpha))) * |
215 | exp(-B*B/(2*beta*beta)) * |
216 | (1-exp(-S*S/(2*_gamma*_gamma))) * |
217 | exp(-2*cc*cc/(AIR_ABS(heval[1])((heval[1]) > 0.0f ? (heval[1]) : -(heval[1]))*heval[0]*heval[0])); |
218 | } |
219 | } |
220 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclHessDotPeakness)(pvl->query[gageSclHessDotPeakness/8] & (1 << (gageSclHessDotPeakness % 8)))) { |
221 | #define OSQT 0.57735026918962576451 |
222 | double neval[3], hlen, pness, |
223 | peak[3] = {-OSQT, -OSQT, -OSQT}; |
224 | ELL_3V_NORM(neval, heval, hlen)(hlen = (sqrt((((heval))[0]*((heval))[0] + ((heval))[1]*((heval ))[1] + ((heval))[2]*((heval))[2]))), ((neval)[0] = (1.0/hlen )*(heval)[0], (neval)[1] = (1.0/hlen)*(heval)[1], (neval)[2] = (1.0/hlen)*(heval)[2])); |
225 | if (!hlen) { |
226 | pness = 0; |
Value stored to 'pness' is never read | |
227 | } else { |
228 | pness = ELL_3V_DOT(peak, neval)((peak)[0]*(neval)[0] + (peak)[1]*(neval)[1] + (peak)[2]*(neval )[2]); |
229 | pness = AIR_AFFINE(-1, pness, 1, 0, 1)( ((double)(1)-(0))*((double)(pness)-(-1)) / ((double)(1)-(-1 )) + (0)); |
230 | pvl->directAnswer[gageSclHessDotPeakness][0] = pness; |
231 | } |
232 | #undef OSQT |
233 | } |
234 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclHessMode)(pvl->query[gageSclHessMode/8] & (1 << (gageSclHessMode % 8)))) { |
235 | pvl->directAnswer[gageSclHessMode][0] = airMode3_d(heval); |
236 | } |
237 | |
238 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageScl2ndDD)(pvl->query[gageScl2ndDD/8] & (1 << (gageScl2ndDD % 8)))) { |
239 | ELL_3MV_MUL(tmpVec, hess, norm)((tmpVec)[0] = (hess)[0]*(norm)[0] + (hess)[1]*(norm)[1] + (hess )[2]*(norm)[2], (tmpVec)[1] = (hess)[3]*(norm)[0] + (hess)[4] *(norm)[1] + (hess)[5]*(norm)[2], (tmpVec)[2] = (hess)[6]*(norm )[0] + (hess)[7]*(norm)[1] + (hess)[8]*(norm)[2]); |
240 | pvl->directAnswer[gageScl2ndDD][0] = ELL_3V_DOT(norm, tmpVec)((norm)[0]*(tmpVec)[0] + (norm)[1]*(tmpVec)[1] + (norm)[2]*(tmpVec )[2]); |
241 | } |
242 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclGeomTens)(pvl->query[gageSclGeomTens/8] & (1 << (gageSclGeomTens % 8)))) { |
243 | if (gmag > ctx->parm.gradMagCurvMin) { |
244 | /* parm.curvNormalSide applied here to determine the sense of the |
245 | normal when doing all curvature calculations */ |
246 | ELL_3M_SCALE(sHess, -(ctx->parm.curvNormalSide)/gmag, hess)((((sHess)+0)[0] = ((-(ctx->parm.curvNormalSide)/gmag))*(( hess)+0)[0], ((sHess)+0)[1] = ((-(ctx->parm.curvNormalSide )/gmag))*((hess)+0)[1], ((sHess)+0)[2] = ((-(ctx->parm.curvNormalSide )/gmag))*((hess)+0)[2]), (((sHess)+3)[0] = ((-(ctx->parm.curvNormalSide )/gmag))*((hess)+3)[0], ((sHess)+3)[1] = ((-(ctx->parm.curvNormalSide )/gmag))*((hess)+3)[1], ((sHess)+3)[2] = ((-(ctx->parm.curvNormalSide )/gmag))*((hess)+3)[2]), (((sHess)+6)[0] = ((-(ctx->parm.curvNormalSide )/gmag))*((hess)+6)[0], ((sHess)+6)[1] = ((-(ctx->parm.curvNormalSide )/gmag))*((hess)+6)[1], ((sHess)+6)[2] = ((-(ctx->parm.curvNormalSide )/gmag))*((hess)+6)[2])); |
247 | |
248 | /* gten = nPerp * sHess * nPerp */ |
249 | ELL_3M_MUL(tmpMat, sHess, nPerp)((tmpMat)[0] = (sHess)[0]*(nPerp)[0] + (sHess)[1]*(nPerp)[3] + (sHess)[2]*(nPerp)[6], (tmpMat)[1] = (sHess)[0]*(nPerp)[1] + (sHess)[1]*(nPerp)[4] + (sHess)[2]*(nPerp)[7], (tmpMat)[2] = (sHess)[0]*(nPerp)[2] + (sHess)[1]*(nPerp)[5] + (sHess)[2]*( nPerp)[8], (tmpMat)[3] = (sHess)[3]*(nPerp)[0] + (sHess)[4]*( nPerp)[3] + (sHess)[5]*(nPerp)[6], (tmpMat)[4] = (sHess)[3]*( nPerp)[1] + (sHess)[4]*(nPerp)[4] + (sHess)[5]*(nPerp)[7], (tmpMat )[5] = (sHess)[3]*(nPerp)[2] + (sHess)[4]*(nPerp)[5] + (sHess )[5]*(nPerp)[8], (tmpMat)[6] = (sHess)[6]*(nPerp)[0] + (sHess )[7]*(nPerp)[3] + (sHess)[8]*(nPerp)[6], (tmpMat)[7] = (sHess )[6]*(nPerp)[1] + (sHess)[7]*(nPerp)[4] + (sHess)[8]*(nPerp)[ 7], (tmpMat)[8] = (sHess)[6]*(nPerp)[2] + (sHess)[7]*(nPerp)[ 5] + (sHess)[8]*(nPerp)[8]); |
250 | ELL_3M_MUL(gten, nPerp, tmpMat)((gten)[0] = (nPerp)[0]*(tmpMat)[0] + (nPerp)[1]*(tmpMat)[3] + (nPerp)[2]*(tmpMat)[6], (gten)[1] = (nPerp)[0]*(tmpMat)[1] + (nPerp)[1]*(tmpMat)[4] + (nPerp)[2]*(tmpMat)[7], (gten)[2] = (nPerp)[0]*(tmpMat)[2] + (nPerp)[1]*(tmpMat)[5] + (nPerp)[2] *(tmpMat)[8], (gten)[3] = (nPerp)[3]*(tmpMat)[0] + (nPerp)[4] *(tmpMat)[3] + (nPerp)[5]*(tmpMat)[6], (gten)[4] = (nPerp)[3] *(tmpMat)[1] + (nPerp)[4]*(tmpMat)[4] + (nPerp)[5]*(tmpMat)[7 ], (gten)[5] = (nPerp)[3]*(tmpMat)[2] + (nPerp)[4]*(tmpMat)[5 ] + (nPerp)[5]*(tmpMat)[8], (gten)[6] = (nPerp)[6]*(tmpMat)[0 ] + (nPerp)[7]*(tmpMat)[3] + (nPerp)[8]*(tmpMat)[6], (gten)[7 ] = (nPerp)[6]*(tmpMat)[1] + (nPerp)[7]*(tmpMat)[4] + (nPerp) [8]*(tmpMat)[7], (gten)[8] = (nPerp)[6]*(tmpMat)[2] + (nPerp) [7]*(tmpMat)[5] + (nPerp)[8]*(tmpMat)[8]); |
251 | |
252 | if (ctx->verbose > 2) { |
253 | fprintf(stderr__stderrp, "%s: gten: \n", me); |
254 | ell_3m_print_d(stderr__stderrp, gten); |
255 | ELL_3MV_MUL(tmpVec, gten, norm)((tmpVec)[0] = (gten)[0]*(norm)[0] + (gten)[1]*(norm)[1] + (gten )[2]*(norm)[2], (tmpVec)[1] = (gten)[3]*(norm)[0] + (gten)[4] *(norm)[1] + (gten)[5]*(norm)[2], (tmpVec)[2] = (gten)[6]*(norm )[0] + (gten)[7]*(norm)[1] + (gten)[8]*(norm)[2]); |
256 | len = ELL_3V_LEN(tmpVec)(sqrt((((tmpVec))[0]*((tmpVec))[0] + ((tmpVec))[1]*((tmpVec)) [1] + ((tmpVec))[2]*((tmpVec))[2]))); |
257 | fprintf(stderr__stderrp, "%s: should be small: %30.15f\n", me, (double)len); |
258 | ell_3v_perp_d(gp1, norm); |
259 | ELL_3MV_MUL(tmpVec, gten, gp1)((tmpVec)[0] = (gten)[0]*(gp1)[0] + (gten)[1]*(gp1)[1] + (gten )[2]*(gp1)[2], (tmpVec)[1] = (gten)[3]*(gp1)[0] + (gten)[4]*( gp1)[1] + (gten)[5]*(gp1)[2], (tmpVec)[2] = (gten)[6]*(gp1)[0 ] + (gten)[7]*(gp1)[1] + (gten)[8]*(gp1)[2]); |
260 | len = ELL_3V_LEN(tmpVec)(sqrt((((tmpVec))[0]*((tmpVec))[0] + ((tmpVec))[1]*((tmpVec)) [1] + ((tmpVec))[2]*((tmpVec))[2]))); |
261 | fprintf(stderr__stderrp, "%s: should be bigger: %30.15f\n", me, (double)len); |
262 | ELL_3V_CROSS(gp2, gp1, norm)((gp2)[0] = (gp1)[1]*(norm)[2] - (gp1)[2]*(norm)[1], (gp2)[1] = (gp1)[2]*(norm)[0] - (gp1)[0]*(norm)[2], (gp2)[2] = (gp1)[ 0]*(norm)[1] - (gp1)[1]*(norm)[0]); |
263 | ELL_3MV_MUL(tmpVec, gten, gp2)((tmpVec)[0] = (gten)[0]*(gp2)[0] + (gten)[1]*(gp2)[1] + (gten )[2]*(gp2)[2], (tmpVec)[1] = (gten)[3]*(gp2)[0] + (gten)[4]*( gp2)[1] + (gten)[5]*(gp2)[2], (tmpVec)[2] = (gten)[6]*(gp2)[0 ] + (gten)[7]*(gp2)[1] + (gten)[8]*(gp2)[2]); |
264 | len = ELL_3V_LEN(tmpVec)(sqrt((((tmpVec))[0]*((tmpVec))[0] + ((tmpVec))[1]*((tmpVec)) [1] + ((tmpVec))[2]*((tmpVec))[2]))); |
265 | fprintf(stderr__stderrp, "%s: should (also) be bigger: %30.15f\n", |
266 | me, (double)len); |
267 | } |
268 | } else { |
269 | ELL_3M_ZERO_SET(gten)((((gten)+0)[0] = (0), ((gten)+0)[1] = (0), ((gten)+0)[2] = ( 0)), (((gten)+3)[0] = (0), ((gten)+3)[1] = (0), ((gten)+3)[2] = (0)), (((gten)+6)[0] = (0), ((gten)+6)[1] = (0), ((gten)+6 )[2] = (0))); |
270 | } |
271 | } |
272 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclGeomTensTen)(pvl->query[gageSclGeomTensTen/8] & (1 << (gageSclGeomTensTen % 8)))) { |
273 | pvl->directAnswer[gageSclGeomTensTen][0] = 1.0; |
274 | TEN_M2T(pvl->directAnswer[gageSclGeomTensTen], |
275 | pvl->directAnswer[gageSclGeomTens]); |
276 | TEN_T_SCALE(pvl->directAnswer[gageSclGeomTensTen], -1, |
277 | pvl->directAnswer[gageSclGeomTensTen]); |
278 | } |
279 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclTotalCurv)(pvl->query[gageSclTotalCurv/8] & (1 << (gageSclTotalCurv % 8)))) { |
280 | curv = pvl->directAnswer[gageSclTotalCurv][0] = ELL_3M_FROB(gten)(sqrt((((gten)+0)[0]*((gten)+0)[0] + ((gten)+0)[1]*((gten)+0) [1] + ((gten)+0)[2]*((gten)+0)[2]) + (((gten)+3)[0]*((gten)+3 )[0] + ((gten)+3)[1]*((gten)+3)[1] + ((gten)+3)[2]*((gten)+3) [2]) + (((gten)+6)[0]*((gten)+6)[0] + ((gten)+6)[1]*((gten)+6 )[1] + ((gten)+6)[2]*((gten)+6)[2]))); |
281 | } |
282 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclShapeTrace)(pvl->query[gageSclShapeTrace/8] & (1 << (gageSclShapeTrace % 8)))) { |
283 | pvl->directAnswer[gageSclShapeTrace][0] = (curv |
284 | ? ELL_3M_TRACE(gten)((gten)[0] + (gten)[4] + (gten)[8])/curv |
285 | : 0); |
286 | } |
287 | if ( (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclK1)(pvl->query[gageSclK1/8] & (1 << (gageSclK1 % 8) ))) || |
288 | (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclK2)(pvl->query[gageSclK2/8] & (1 << (gageSclK2 % 8) ))) ){ |
289 | double T, N, D; |
290 | T = ELL_3M_TRACE(gten)((gten)[0] + (gten)[4] + (gten)[8]); |
291 | N = curv; |
292 | D = 2*N*N - T*T; |
293 | /* |
294 | if (D < -0.0000001) { |
295 | fprintf(stderr, "%s: %g %g\n", me, T, N); |
296 | fprintf(stderr, "%s: !!! D curv determinant % 22.10f < 0.0\n", me, D); |
297 | fprintf(stderr, "%s: gten: \n", me); |
298 | ell_3m_print_d(stderr, gten); |
299 | } |
300 | */ |
301 | D = AIR_MAX(D, 0)((D) > (0) ? (D) : (0)); |
302 | D = sqrt(D); |
303 | k1[0] = 0.5*(T + D); |
304 | k2[0] = 0.5*(T - D); |
305 | } |
306 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclMeanCurv)(pvl->query[gageSclMeanCurv/8] & (1 << (gageSclMeanCurv % 8)))) { |
307 | pvl->directAnswer[gageSclMeanCurv][0] = (*k1 + *k2)/2; |
308 | } |
309 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclGaussCurv)(pvl->query[gageSclGaussCurv/8] & (1 << (gageSclGaussCurv % 8)))) { |
310 | pvl->directAnswer[gageSclGaussCurv][0] = (*k1)*(*k2); |
311 | } |
312 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclShapeIndex)(pvl->query[gageSclShapeIndex/8] & (1 << (gageSclShapeIndex % 8)))) { |
313 | pvl->directAnswer[gageSclShapeIndex][0] = |
314 | -(2/AIR_PI3.14159265358979323846)*atan2(*k1 + *k2, *k1 - *k2); |
315 | } |
316 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclCurvDir1)(pvl->query[gageSclCurvDir1/8] & (1 << (gageSclCurvDir1 % 8)))) { |
317 | /* HEY: this only works when K1, K2, 0 are all well mutually distinct, |
318 | since these are the eigenvalues of the geometry tensor, and this |
319 | code assumes that the eigenspaces are all one-dimensional */ |
320 | ELL_3M_COPY(tmpMat, gten)((((tmpMat)+0)[0] = ((gten)+0)[0], ((tmpMat)+0)[1] = ((gten)+ 0)[1], ((tmpMat)+0)[2] = ((gten)+0)[2]), (((tmpMat)+3)[0] = ( (gten)+3)[0], ((tmpMat)+3)[1] = ((gten)+3)[1], ((tmpMat)+3)[2 ] = ((gten)+3)[2]), (((tmpMat)+6)[0] = ((gten)+6)[0], ((tmpMat )+6)[1] = ((gten)+6)[1], ((tmpMat)+6)[2] = ((gten)+6)[2])); |
321 | ELL_3M_DIAG_SET(tmpMat, gten[0] - *k1, gten[4]- *k1, gten[8] - *k1)((tmpMat)[0] = (gten[0] - *k1), (tmpMat)[4] = (gten[4]- *k1), (tmpMat)[8] = (gten[8] - *k1)); |
322 | ell_3m_1d_nullspace_d(tmpVec, tmpMat); |
323 | ELL_3V_COPY(pvl->directAnswer[gageSclCurvDir1], tmpVec)((pvl->directAnswer[gageSclCurvDir1])[0] = (tmpVec)[0], (pvl ->directAnswer[gageSclCurvDir1])[1] = (tmpVec)[1], (pvl-> directAnswer[gageSclCurvDir1])[2] = (tmpVec)[2]); |
324 | } |
325 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclCurvDir2)(pvl->query[gageSclCurvDir2/8] & (1 << (gageSclCurvDir2 % 8)))) { |
326 | /* HEY: this only works when K1, K2, 0 are all well mutually distinct, |
327 | since these are the eigenvalues of the geometry tensor, and this |
328 | code assumes that the eigenspaces are all one-dimensional */ |
329 | ELL_3M_COPY(tmpMat, gten)((((tmpMat)+0)[0] = ((gten)+0)[0], ((tmpMat)+0)[1] = ((gten)+ 0)[1], ((tmpMat)+0)[2] = ((gten)+0)[2]), (((tmpMat)+3)[0] = ( (gten)+3)[0], ((tmpMat)+3)[1] = ((gten)+3)[1], ((tmpMat)+3)[2 ] = ((gten)+3)[2]), (((tmpMat)+6)[0] = ((gten)+6)[0], ((tmpMat )+6)[1] = ((gten)+6)[1], ((tmpMat)+6)[2] = ((gten)+6)[2])); |
330 | ELL_3M_DIAG_SET(tmpMat, gten[0] - *k2, gten[4] - *k2, gten[8] - *k2)((tmpMat)[0] = (gten[0] - *k2), (tmpMat)[4] = (gten[4] - *k2) , (tmpMat)[8] = (gten[8] - *k2)); |
331 | ell_3m_1d_nullspace_d(tmpVec, tmpMat); |
332 | ELL_3V_COPY(pvl->directAnswer[gageSclCurvDir2], tmpVec)((pvl->directAnswer[gageSclCurvDir2])[0] = (tmpVec)[0], (pvl ->directAnswer[gageSclCurvDir2])[1] = (tmpVec)[1], (pvl-> directAnswer[gageSclCurvDir2])[2] = (tmpVec)[2]); |
333 | } |
334 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclFlowlineCurv)(pvl->query[gageSclFlowlineCurv/8] & (1 << (gageSclFlowlineCurv % 8)))) { |
335 | if (gmag >= ctx->parm.gradMagCurvMin) { |
336 | /* because of the gageSclGeomTens prerequisite, sHess, nPerp, and |
337 | nProj are all already set */ |
338 | /* ncTen = nPerp * sHess * nProj */ |
339 | ELL_3M_MUL(tmpMat, sHess, nProj)((tmpMat)[0] = (sHess)[0]*(nProj)[0] + (sHess)[1]*(nProj)[3] + (sHess)[2]*(nProj)[6], (tmpMat)[1] = (sHess)[0]*(nProj)[1] + (sHess)[1]*(nProj)[4] + (sHess)[2]*(nProj)[7], (tmpMat)[2] = (sHess)[0]*(nProj)[2] + (sHess)[1]*(nProj)[5] + (sHess)[2]*( nProj)[8], (tmpMat)[3] = (sHess)[3]*(nProj)[0] + (sHess)[4]*( nProj)[3] + (sHess)[5]*(nProj)[6], (tmpMat)[4] = (sHess)[3]*( nProj)[1] + (sHess)[4]*(nProj)[4] + (sHess)[5]*(nProj)[7], (tmpMat )[5] = (sHess)[3]*(nProj)[2] + (sHess)[4]*(nProj)[5] + (sHess )[5]*(nProj)[8], (tmpMat)[6] = (sHess)[6]*(nProj)[0] + (sHess )[7]*(nProj)[3] + (sHess)[8]*(nProj)[6], (tmpMat)[7] = (sHess )[6]*(nProj)[1] + (sHess)[7]*(nProj)[4] + (sHess)[8]*(nProj)[ 7], (tmpMat)[8] = (sHess)[6]*(nProj)[2] + (sHess)[7]*(nProj)[ 5] + (sHess)[8]*(nProj)[8]); |
340 | ELL_3M_MUL(ncTen, nPerp, tmpMat)((ncTen)[0] = (nPerp)[0]*(tmpMat)[0] + (nPerp)[1]*(tmpMat)[3] + (nPerp)[2]*(tmpMat)[6], (ncTen)[1] = (nPerp)[0]*(tmpMat)[1 ] + (nPerp)[1]*(tmpMat)[4] + (nPerp)[2]*(tmpMat)[7], (ncTen)[ 2] = (nPerp)[0]*(tmpMat)[2] + (nPerp)[1]*(tmpMat)[5] + (nPerp )[2]*(tmpMat)[8], (ncTen)[3] = (nPerp)[3]*(tmpMat)[0] + (nPerp )[4]*(tmpMat)[3] + (nPerp)[5]*(tmpMat)[6], (ncTen)[4] = (nPerp )[3]*(tmpMat)[1] + (nPerp)[4]*(tmpMat)[4] + (nPerp)[5]*(tmpMat )[7], (ncTen)[5] = (nPerp)[3]*(tmpMat)[2] + (nPerp)[4]*(tmpMat )[5] + (nPerp)[5]*(tmpMat)[8], (ncTen)[6] = (nPerp)[6]*(tmpMat )[0] + (nPerp)[7]*(tmpMat)[3] + (nPerp)[8]*(tmpMat)[6], (ncTen )[7] = (nPerp)[6]*(tmpMat)[1] + (nPerp)[7]*(tmpMat)[4] + (nPerp )[8]*(tmpMat)[7], (ncTen)[8] = (nPerp)[6]*(tmpMat)[2] + (nPerp )[7]*(tmpMat)[5] + (nPerp)[8]*(tmpMat)[8]); |
341 | } else { |
342 | ELL_3M_ZERO_SET(ncTen)((((ncTen)+0)[0] = (0), ((ncTen)+0)[1] = (0), ((ncTen)+0)[2] = (0)), (((ncTen)+3)[0] = (0), ((ncTen)+3)[1] = (0), ((ncTen)+ 3)[2] = (0)), (((ncTen)+6)[0] = (0), ((ncTen)+6)[1] = (0), (( ncTen)+6)[2] = (0))); |
343 | } |
344 | /* there used to be a wrong extra sqrt() here */ |
345 | pvl->directAnswer[gageSclFlowlineCurv][0] = ELL_3M_FROB(ncTen)(sqrt((((ncTen)+0)[0]*((ncTen)+0)[0] + ((ncTen)+0)[1]*((ncTen )+0)[1] + ((ncTen)+0)[2]*((ncTen)+0)[2]) + (((ncTen)+3)[0]*(( ncTen)+3)[0] + ((ncTen)+3)[1]*((ncTen)+3)[1] + ((ncTen)+3)[2] *((ncTen)+3)[2]) + (((ncTen)+6)[0]*((ncTen)+6)[0] + ((ncTen)+ 6)[1]*((ncTen)+6)[1] + ((ncTen)+6)[2]*((ncTen)+6)[2]))); |
346 | } |
347 | if (GAGE_QUERY_ITEM_TEST(pvl->query, gageSclMedian)(pvl->query[gageSclMedian/8] & (1 << (gageSclMedian % 8)))) { |
348 | /* this item is currently a complete oddball in that it does not |
349 | benefit from anything done in the "filter" stage, which is in |
350 | fact a waste of time if the query consists only of this item */ |
351 | fd = 2*ctx->radius; |
352 | if (fd > FD_MEDIAN_MAX16) { |
353 | fprintf(stderr__stderrp, "%s: PANIC: current filter diameter = %d " |
354 | "> FD_MEDIAN_MAX = %d\n", me, fd, FD_MEDIAN_MAX16); |
355 | exit(1); |
356 | } |
357 | fw = ctx->fw + fd*3*gageKernel00; |
358 | /* HEY: this needs some optimization help */ |
359 | wghtSum = 0; |
360 | nidx = 0; |
361 | for (xi=0; xi<fd; xi++) { |
362 | for (yi=0; yi<fd; yi++) { |
363 | for (zi=0; zi<fd; zi++) { |
364 | iv3wght[0 + 2*nidx] = pvl->iv3[nidx]; |
365 | iv3wght[1 + 2*nidx] = fw[xi + 0*fd]*fw[yi + 1*fd]*fw[zi + 2*fd]; |
366 | wghtSum += iv3wght[1 + 2*nidx]; |
367 | nidx++; |
368 | } |
369 | } |
370 | } |
371 | qsort(iv3wght, fd*fd*fd, 2*sizeof(double), nrrdValCompare[nrrdTypeDouble]); |
372 | wght = 0; |
373 | for (nidx=0; nidx<fd*fd*fd; nidx++) { |
374 | wght += iv3wght[1 + 2*nidx]; |
375 | if (wght > wghtSum/2) { |
376 | break; |
377 | } |
378 | } |
379 | pvl->directAnswer[gageSclMedian][0] = iv3wght[0 + 2*nidx]; |
380 | } |
381 | return; |
382 | } |
383 | |
384 | #undef TEN_M2T |
385 | #undef TEN_T_SCALE |