00001 #ifndef  __JBXL_CPP_GRAPHIC_MATH_H_
00002 #define  __JBXL_CPP_GRAPHIC_MATH_H_
00003 
00004 
00013 #include "Gdata.h"
00014 
00015 
00016 
00017 namespace jbxl {
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00045 
00046 
00061 template <typename R, typename T> MSGraph<R>  Laplacian(MSGraph<T> vp, int mode=0)
00062 {
00063     int i, j;
00064     int nx, ny, xs, xs2;
00065     R   da, db, dc, dd, de, df, dg, dh;
00066     MSGraph<R> lp;
00067     
00068     lp.mimicry(vp);
00069     lp.base = lp.zero = 0;
00070 
00071     if (lp.isNull()) {
00072         DEBUG_MODE PRINT_MESG("LAPLACIAN: No More Memory!!!\n");
00073         lp.state = JBXL_GRAPH_MEMORY_ERROR;
00074         return lp;
00075     }
00076 
00077     xs  = vp.xs;
00078     xs2 = 2*xs;
00079 
00080     if (mode==4) {
00081         for (j=1; j<vp.ys-1; j++) {
00082             ny = j*vp.xs;
00083             for (i=1; i<vp.xs-1; i++) {
00084                 nx = ny + i;
00085                 da = vp.gp[nx+1]  + vp.gp[nx-1];
00086                 db = vp.gp[nx];
00087                 dc = vp.gp[nx+xs] + vp.gp[nx-xs];
00088                 lp.gp[nx] = (R)(da - 4.*db + dc);
00089                 
00090                 
00091                 
00092                 
00093             }
00094         }
00095     }
00096 
00097     else if (mode==8) {
00098         for (j=1; j<vp.ys-1; j++) {
00099             ny = j*vp.xs;
00100             for (i=1; i<vp.xs-1; i++) {
00101                 nx = ny + i;
00102                 da = vp.gp[nx+1]    + vp.gp[nx-1];
00103                 db = vp.gp[nx+xs]   + vp.gp[nx-xs];
00104                 dc = vp.gp[nx];
00105                 dd = vp.gp[nx+1+xs] + vp.gp[nx-1+xs];
00106                 de = vp.gp[nx+1-xs] + vp.gp[nx-1-xs];
00107                 lp.gp[nx] = (R)(da + db - 8.*dc + dd + de);
00108                 
00109                 
00110                 
00111                 
00112                 
00113                 
00114             }
00115         }
00116     }
00117 
00118     else {
00119         for (j=2; j<vp.ys-2; j++) {
00120             ny = j*vp.xs;
00121             for (i=2; i<vp.xs-2; i++) {
00122                 nx = ny + i;
00123                 da = vp.gp[nx];
00124                 db = vp.gp[nx+1]     + vp.gp[nx-1]   + vp.gp[nx+xs]   + vp.gp[nx-xs];
00125                 dc = vp.gp[nx-1-xs2] + vp.gp[nx-xs2] + vp.gp[nx+1-xs2];
00126                 dd = vp.gp[nx-1+xs2] + vp.gp[nx+xs2] + vp.gp[nx+1+xs2];
00127                 de = vp.gp[nx-2-xs ] + vp.gp[nx-2]   + vp.gp[nx-2+xs];
00128                 df = vp.gp[nx+2-xs ] + vp.gp[nx+2]   + vp.gp[nx+2+xs];
00129                 dg = vp.gp[nx-2-xs2] + vp.gp[nx+2-xs2];
00130                 dh = vp.gp[nx-2+xs2] + vp.gp[nx+2+xs2];
00131                 lp.gp[nx] = (R)((-12.*da - 4.*db + 2.*(dc+dd+de+df) + dg + dh)/32.);
00132 
00133                 
00134                 
00135                 
00136                 
00137                 
00138                 
00139                 
00140                 
00141                 
00142             }
00143         }
00144     }
00145 
00146     return lp;
00147 }
00148 
00149 
00158 template <typename R, typename T>  MSGraph<R>  xSobel(MSGraph<T> vp)
00159 {
00160     int  i, j, k;
00161     int  pl, nx, ny, nz;
00162     R    da, db, dc, dd, de, nr;
00163     MSGraph<R> xp;
00164  
00165     xp.mimicry(vp);
00166     xp.base = xp.zero = 0;
00167 
00168     if (xp.isNull()) {
00169         DEBUG_MODE PRINT_MESG("XSOBEL: No More Memory!!!\n");
00170         xp.state = JBXL_GRAPH_MEMORY_ERROR;
00171         return xp;
00172     }
00173 
00174     
00175     CVCounter*   vcounter = NULL;
00176     if (vp.zs>2) vcounter = GetUsableGlobalCounter();
00177     if (vcounter!=NULL) vcounter->SetMax(vp.zs);
00178 
00179     pl = vp.xs*vp.ys;
00180     for (k=0; k<vp.zs; k++) {
00181         nz = k*pl;
00182         for (j=1; j<vp.ys-1; j++) {
00183             ny = nz + j*vp.xs;
00184             for (i=1; i<vp.xs-1; i++) {
00185                 nx = ny + i;
00186                 da = vp.gp[nx+1-vp.xs] - vp.gp[nx-1-vp.xs];                 
00187                 db = vp.gp[nx+1]       - vp.gp[nx-1];                       
00188                 dc = vp.gp[nx+1+vp.xs] - vp.gp[nx-1+vp.xs];
00189                 
00190                 
00191                 
00192 
00193                 if (k==0 || k==vp.zs-1) {
00194                     dd = de = 0;
00195                     nr = 8;
00196                 }
00197                 else {
00198                     dd = vp.gp[nx+1-pl] - vp.gp[nx-1-pl];                   
00199                     de = vp.gp[nx+1+pl] - vp.gp[nx-1+pl];
00200                     
00201                     
00202                     nr = 12;
00203                 }
00204 
00205                 xp.gp[nx] = (R)((da + 2.*db + dc + dd + de)/nr);
00206             }
00207         }
00208         if (vcounter!=NULL) vcounter->StepIt();
00209     }
00210 
00211     return xp;
00212 }
00213 
00214 
00223 template<typename R, typename T>  MSGraph<R>  ySobel(MSGraph<T> vp)
00224 {
00225     int  i, j, k;
00226     int  pl, nx, ny, nz;
00227     R    da, db, dc, dd, de, nr;
00228     MSGraph<R> xp;
00229  
00230     xp.mimicry(vp);
00231     xp.base = xp.zero = 0;
00232 
00233     if (xp.isNull()) {
00234         DEBUG_MODE PRINT_MESG("YSOBEL: No More Memory!!\n");
00235         xp.state = JBXL_GRAPH_MEMORY_ERROR;
00236         return xp;
00237     }
00238 
00239     
00240     CVCounter*   vcounter = NULL;
00241     if (vp.zs>2) vcounter = GetUsableGlobalCounter();
00242     if (vcounter!=NULL) vcounter->SetMax(vp.zs);
00243 
00244     pl = vp.xs*vp.ys;
00245     for (k=0; k<vp.zs; k++) {
00246         nz = k*pl;
00247         for (j=1; j<vp.ys-1; j++) {
00248             ny = nz + j*vp.xs;
00249             for (i=1; i<vp.xs-1; i++) {
00250                 nx = ny + i;
00251                 da = vp.gp[nx-1+vp.xs] - vp.gp[nx-1-vp.xs];
00252                 db = vp.gp[nx  +vp.xs] - vp.gp[nx  -vp.xs];
00253                 dc = vp.gp[nx+1+vp.xs] - vp.gp[nx+1-vp.xs];
00254                 
00255                 
00256                 
00257 
00258                 if (k==0 || k==vp.zs-1) {
00259                     dd = de = 0;
00260                     nr = 8;
00261                 }
00262                 else {
00263                     dd = vp.gp[nx+vp.xs-pl] - vp.gp[nx-vp.xs-pl];
00264                     de = vp.gp[nx+vp.xs+pl] - vp.gp[nx-vp.xs+pl];
00265                     
00266                     
00267                     nr = 12;
00268                 }   
00269 
00270                 xp.gp[nx] = (R)((da + 2.*db + dc + dd + de)/nr);
00271             }
00272         }
00273         if (vcounter!=NULL) vcounter->StepIt();
00274     }
00275 
00276     return xp;
00277 }
00278 
00279 
00288 template<typename R, typename T>  MSGraph<R>  zSobel(MSGraph<T> vp)
00289 {
00290     int  i, j, k;
00291     int  pl, nx, ny, nz;
00292     R    da, db, dc, dd, de;
00293     MSGraph<R> xp;
00294 
00295     xp.mimicry(vp);
00296     xp.base = xp.zero = 0;
00297 
00298     if (xp.isNull()) {
00299         DEBUG_MODE PRINT_MESG("ZSOBEL: No More Memory!!\n");
00300         xp.state = JBXL_GRAPH_MEMORY_ERROR;
00301         return xp;
00302     }
00303     if (vp.zs<2) {
00304         xp.state = JBXL_GRAPH_NODATA_ERROR;
00305         return xp;      
00306     }
00307 
00308     
00309     CVCounter*   vcounter = NULL;
00310     if (vp.zs>2) vcounter = GetUsableGlobalCounter();
00311     if (vcounter!=NULL) vcounter->SetMax(vp.zs-1);
00312 
00313     pl = vp.xs*vp.ys;
00314     for (k=1; k<vp.zs-1; k++) {
00315         nz = k*pl;
00316         for (j=1; j<vp.ys-1; j++) {
00317             ny = nz + j*vp.xs;
00318             for (i=1; i<vp.xs-1; i++) {
00319                 nx = ny +i;
00320                 da = vp.gp[nx-1+pl]     - vp.gp[nx-1-pl];
00321                 db = vp.gp[nx+1+pl]     - vp.gp[nx+1-pl];
00322                 dc = vp.gp[nx  +pl]     - vp.gp[nx  -pl];
00323                 dd = vp.gp[nx-vp.xs+pl] - vp.gp[nx-vp.xs-pl];
00324                 de = vp.gp[nx+vp.xs+pl] - vp.gp[nx+vp.xs-pl];
00325                 
00326                 
00327                 
00328                 
00329                 
00330                 xp.gp[nx] = (R)((da + db + 2.*dc + dd + de)/12.);
00331             }
00332         }
00333         if (vcounter!=NULL) vcounter->StepIt();
00334     }
00335 
00336     
00337     nz = (vp.zs-1)*pl;
00338     for (j=1; j<vp.ys-1; j++) {
00339         ny = j*vp.xs;
00340         for (i=1; i<vp.xs-1; i++) {
00341             nx = ny + i;
00342             da = vp.gp[nx];
00343             db = vp.gp[nx+pl];
00344             dc = vp.gp[nx+1    +pl] + vp.gp[nx-1    +pl];
00345             dd = vp.gp[nx+vp.xs+pl] + vp.gp[nx-vp.xs+pl];
00346             
00347             
00348             
00349             
00350             xp.gp[nx] = (R)((2.*db + dc + dd)/6. - da);
00351         }
00352 
00353         ny = ny + nz;
00354         for (i=1; i<vp.xs-1; i++) {
00355             nx = ny + i;
00356             da = vp.gp[nx];
00357             db = vp.gp[nx-pl];
00358             dc = vp.gp[nx+1    -pl] + vp.gp[nx-1    -pl];
00359             dd = vp.gp[nx+vp.xs-pl] + vp.gp[nx-vp.xs-pl];
00360             
00361             
00362             
00363             
00364             xp.gp[nx] = (R)(da - (2.*db + dc + dd)/6.);
00365         }
00366     }
00367 
00368     if (vcounter!=NULL) vcounter->PutFill();
00369 
00370     return xp;
00371 }
00372 
00373 
00382 template<typename R, typename T>  MSGraph<R>  xxSobel(MSGraph<T> vp)
00383 {
00384     int  i, j, k;
00385     int  pl, nx, ny, nz, pl2, xs, xs2;
00386     R    da, db, dc, dd, de;
00387     R    df, dg, dh, di, dj, dk, dl, dm, nr;
00388     MSGraph<R> xp;
00389    
00390     xp.mimicry(vp);
00391     xp.base = xp.zero = 0;
00392 
00393     if (xp.isNull()) {
00394         DEBUG_MODE PRINT_MESG("XXSOBEL: No More Memory!!\n");
00395         xp.state = JBXL_GRAPH_MEMORY_ERROR;
00396         return xp;
00397     }
00398     
00399     
00400     CVCounter*   vcounter = NULL;
00401     if (vp.zs>2) vcounter = GetUsableGlobalCounter();
00402     if (vcounter!=NULL) vcounter->SetMax(vp.zs);
00403 
00404     pl  = vp.xs*vp.ys;
00405     pl2 = 2*pl;
00406     xs  = vp.xs;
00407     xs2 = 2*vp.xs;
00408 
00409     for (k=0; k<vp.zs; k++) {
00410         nz = k*pl;
00411         for (j=2; j<vp.ys-2; j++) {
00412             ny = nz + j*vp.xs;
00413             for (i=2; i<vp.xs-2; i++) {
00414                 nx = ny + i;
00415                 da = vp.gp[nx+2-xs2] - 2*vp.gp[nx-xs2] + vp.gp[nx-2-xs2];
00416                 db = vp.gp[nx+2-xs ] - 2*vp.gp[nx-xs]  + vp.gp[nx-2-xs];
00417                 dc = vp.gp[nx+2]     - 2*vp.gp[nx]     + vp.gp[nx-2];
00418                 dd = vp.gp[nx+2+xs]  - 2*vp.gp[nx+xs]  + vp.gp[nx-2+xs];
00419                 de = vp.gp[nx+2+xs2] - 2*vp.gp[nx+xs2] + vp.gp[nx-2+xs2];
00420                 
00421                 
00422                 
00423                 
00424                 
00425 
00426                 if (k==0 || k==vp.zs-1) {
00427                     dc = (R)(6.*dc);
00428                     df = dg = dh = di = dj = dk = dl = dm = 0;
00429                     nr = 64;
00430                 }
00431                 else {
00432                     dc = (R)(8.*dc);
00433                     df = vp.gp[nx+2-xs-pl] - 2*vp.gp[nx-xs-pl] + vp.gp[nx-2-xs-pl];
00434                     dg = vp.gp[nx+2   -pl] - 2*vp.gp[nx   -pl] + vp.gp[nx-2   -pl];
00435                     dh = vp.gp[nx+2+xs-pl] - 2*vp.gp[nx+xs-pl] + vp.gp[nx-2+xs-pl];
00436                     di = vp.gp[nx+2-xs+pl] - 2*vp.gp[nx-xs+pl] + vp.gp[nx-2-xs+pl];
00437                     dj = vp.gp[nx+2   +pl] - 2*vp.gp[nx   +pl] + vp.gp[nx-2   +pl];
00438                     dk = vp.gp[nx+2+xs+pl] - 2*vp.gp[nx+xs+pl] + vp.gp[nx-2+xs+pl];
00439                     
00440                     
00441                     
00442                     
00443                     
00444                     
00445 
00446                     if (k==1 || k==vp.zs-2) {
00447                         dl = dm = 0;
00448                         nr = 136;
00449                     }
00450                     else {
00451                         dl = vp.gp[nx+2-pl2] - 2*vp.gp[nx-pl2] + vp.gp[nx-2-pl2];
00452                         dm = vp.gp[nx+2+pl2] - 2*vp.gp[nx+pl2] + vp.gp[nx-2+pl2];\
00453                         
00454                         
00455                         nr = 144;
00456                     }
00457                 }
00458                 xp.gp[nx] = (R)((dc + 4.*(db+dd+dg+dj) + 2.*(df+dh+di+dk) + da+de+dl+dm)/nr);
00459             }
00460         }
00461         if (vcounter!=NULL) vcounter->StepIt();
00462     }
00463     
00464     return xp;
00465 }
00466 
00467 
00476 template<typename R, typename T>  MSGraph<R>  yySobel(MSGraph<T> vp)
00477 {
00478     int  i, j, k;
00479     int  pl, nx, ny, nz, pl2, xs, xs2;
00480     R    da, db, dc, dd, de;
00481     R    df, dg, dh, di, dj, dk, dl, dm, nr;
00482     MSGraph<R> xp;
00483     
00484     xp.mimicry(vp);
00485     xp.base = xp.zero = 0;
00486 
00487     if (xp.isNull()) {
00488         DEBUG_MODE PRINT_MESG("YYSOBEL: No More Memory!!\n");
00489         xp.state = JBXL_GRAPH_MEMORY_ERROR;
00490         return xp;
00491     }
00492  
00493     
00494     CVCounter*   vcounter = NULL;
00495     if (vp.zs>2) vcounter = GetUsableGlobalCounter();
00496     if (vcounter!=NULL) vcounter->SetMax(vp.zs);
00497 
00498     pl  = vp.xs*vp.ys;
00499     pl2 = 2*pl;
00500     xs  = vp.xs;
00501     xs2 = 2*vp.xs;
00502 
00503     for (k=0; k<vp.zs; k++) {
00504         nz = k*pl;
00505         for (j=2; j<vp.ys-2; j++) {
00506             ny = nz + j*vp.xs;
00507             for (i=2; i<vp.xs-2; i++) {
00508                 nx = ny + i;
00509                 da = vp.gp[nx-2+xs2] - 2*vp.gp[nx-2] + vp.gp[nx-2-xs2];
00510                 db = vp.gp[nx-1+xs2] - 2*vp.gp[nx-1] + vp.gp[nx-1-xs2];
00511                 dc = vp.gp[nx  +xs2] - 2*vp.gp[nx]   + vp.gp[nx  -xs2];
00512                 dd = vp.gp[nx+1+xs2] - 2*vp.gp[nx+1] + vp.gp[nx+1-xs2];
00513                 de = vp.gp[nx+2+xs2] - 2*vp.gp[nx+2] + vp.gp[nx+2-xs2];
00514                 
00515                 
00516                 
00517                 
00518                 
00519 
00520                 if (k==0 || k==vp.zs-1) {
00521                     dc = (R)(6.*dc);
00522                     df = dg = dh = di = dj = dk = dl = dm = 0;
00523                     nr = 64;
00524                 }
00525                 else {
00526                     dc = (R)(8.*dc);
00527                     df = vp.gp[nx-1+xs2-pl] - 2*vp.gp[nx-1-pl] + vp.gp[nx-1-xs2-pl];
00528                     dg = vp.gp[nx  +xs2-pl] - 2*vp.gp[nx  -pl] + vp.gp[nx  -xs2-pl];
00529                     dh = vp.gp[nx+1+xs2-pl] - 2*vp.gp[nx+1-pl] + vp.gp[nx+1-xs2-pl];
00530                     di = vp.gp[nx-1+xs2+pl] - 2*vp.gp[nx-1+pl] + vp.gp[nx-1-xs2+pl];
00531                     dj = vp.gp[nx  +xs2+pl] - 2*vp.gp[nx  +pl] + vp.gp[nx  -xs2+pl];
00532                     dk = vp.gp[nx+1+xs2+pl] - 2*vp.gp[nx+1+pl] + vp.gp[nx+1-xs2+pl];                
00533                     
00534                     
00535                     
00536                     
00537                     
00538                     
00539 
00540                     if (k==1 || k==vp.zs-2) {
00541                         dl = dm = 0;
00542                         nr = 136;
00543                     }
00544                     else {
00545                         dl = vp.gp[nx+xs2-pl2] - 2*vp.gp[nx-pl2] + vp.gp[nx-xs2-pl2];
00546                         dm = vp.gp[nx+xs2+pl2] - 2*vp.gp[nx+pl2] + vp.gp[nx-xs2+pl2];
00547                         
00548                         
00549                         nr = 144;
00550                     }
00551                 }
00552                 xp.gp[nx] = (R)((dc + 4.*(db+dd+dg+dj) + 2.*(df+dh+di+dk) + da+de+dl+dm)/nr);
00553             }
00554         }
00555         if (vcounter!=NULL) vcounter->StepIt();
00556     }
00557 
00558     return xp;
00559 }
00560 
00561 
00570 template<typename R, typename T>  MSGraph<R> zzSobel(MSGraph<T> vp)
00571 {
00572     int  i, j, k;
00573     R    da, db, dc, dd, de;
00574     R    df, dg, dh, di, dj, dk, dl, dm;
00575     MSGraph<R>  pp, xp;
00576     
00577     if (vp.zs<2) {      
00578         pp.mimicry(vp);
00579         pp.state = JBXL_GRAPH_NODATA_ERROR;
00580         return pp;
00581     }
00582 
00583     
00584     CVCounter* vcounter = NULL;
00585     CVCounter* ccounter = NULL;
00586     if (vp.zs>2) vcounter = GetUsableGlobalCounter();
00587     if (vcounter!=NULL) {
00588         vcounter->SetMax(200);
00589         ccounter = vcounter->MakeChildCounter(100);
00590         SetGlobalCounter(ccounter);
00591     }
00592 
00593     pp = zSobel<R>(vp);
00594 
00595     if (vcounter!=NULL) {
00596         vcounter->DeleteChildCounter();
00597         ccounter = vcounter->MakeChildCounter(100);
00598         SetGlobalCounter(ccounter);
00599     }
00600 
00601     if (!pp.isNull()) {
00602         xp = zSobel<R>(pp);
00603         pp.free();
00604     }
00605     else xp = pp;
00606 
00607     if (vcounter!=NULL) {
00608         vcounter->DeleteChildCounter();
00609         SetGlobalCounter(vcounter);
00610         vcounter->PutFill();
00611     }
00612 
00613 
00614 
00615 
00616 
00617 
00618 
00619 
00620 
00621 
00622 
00623 
00624 
00625 
00626 
00627 
00628 
00629 
00630 
00631 
00632 
00633 
00634 
00635     return xp;
00636 }
00637 
00638 
00647 template <typename R, typename T>  MSGraph<Vector<R> >  vNabla(MSGraph<T> vp)  
00648 {
00649     int   i;
00650     MSGraph<R>  px, py, pz;
00651     MSGraph<Vector<R> > nv;
00652 
00653     
00654     nv.xs = vp.xs;
00655     nv.ys = vp.ys;
00656     nv.zs = vp.zs;
00657     nv.zero.set(vp.zero, vp.zero, vp.zero);
00658     nv.base.set(vp.base, vp.base, vp.base);
00659     nv.RZxy = vp.RZxy;
00660     nv.rbound = vp.rbound;
00661 
00662     nv.gp = (Vector<R>*)malloc(sizeof(Vector<R>)*nv.xs*nv.ys*nv.zs);
00663     if (nv.isNull()) {
00664         DEBUG_MODE PRINT_MESG("vNabla: No More Memory!!\n");
00665         nv.state = JBXL_GRAPH_MEMORY_ERROR;
00666         return nv;
00667     }
00668     for (i=0; i<vp.xs*vp.ys*vp.zs; i++) {
00669         nv.gp[i] = nv.base;
00670     }
00671          
00672     px = xSobel<R>(vp);
00673     if (px.gp==NULL) {
00674         nv.state = px.state;
00675         return nv;
00676     }
00677 
00678     py = ySobel<R>(vp);
00679     if (py.gp==NULL) {
00680         px.free();
00681         nv.state = py.state;
00682         return nv;
00683     }
00684 
00685     pz = zSobel<R>(vp);     
00686     if (pz.gp==NULL) {
00687         px.free();
00688         py.free();
00689         nv.state = pz.state;
00690         return nv;
00691     }
00692 
00693     for (i=0; i<vp.xs*vp.ys*vp.zs; i++) {
00694         (nv.gp[i])->set_Vector(px.gp[i], py.gp[i], pz.gp[i]);
00695     }
00696 
00697     px.free();
00698     py.free();
00699     pz.free();
00700 
00701     return nv;
00702 }
00703 
00704 
00713 template <typename R, typename T>  MSGraph<R>  Nabla(MSGraph<T> vp)  
00714 {
00715     int   i;
00716     R     xx, yy, zz;
00717     MSGraph<R> px, py, pz, nv;
00718 
00719     nv.mimicry(vp);
00720     if (nv.isNull()) {
00721         DEBUG_MODE PRINT_MESG("Nabla: No More Memory!!\n");
00722         nv.state = JBXL_GRAPH_MEMORY_ERROR;
00723         return nv;
00724     }
00725 
00726     px = xSobel<R>(vp);
00727     if (px.gp==NULL) {
00728         nv.state = px.state;
00729         return nv;
00730     }
00731 
00732     py = ySobel<R>(vp);
00733     if (py.gp==NULL) {
00734         px.free();
00735         nv.state = py.state;
00736         return nv;
00737     }
00738 
00739     pz = zSobel<R>(vp);
00740     if (pz.gp==NULL) {
00741         px.free();
00742         py.free();
00743         nv.state = pz.state;
00744         return nv;
00745     }
00746 
00747     for (i=0; i<vp.xs*vp.ys*vp.zs; i++) {
00748         xx = px.gp[i];
00749         yy = py.gp[i];
00750         zz = pz.gp[i];
00751         nv.gp[i] = (R)sqrt((double)xx*xx + yy*yy + zz*zz);
00752     }
00753 
00754     px.free();
00755     py.free();
00756     pz.free();
00757 
00758     return nv;
00759 }
00760 
00761 
00774 template <typename R, typename T>  MSGraph<R>  edgeEnhance(MSGraph<T> gd, int mode=0)
00775 {
00776     int  i;
00777     MSGraph<R> la, vp;
00778 
00779     vp.mimicry(gd);
00780     if (vp.isNull()) {
00781         DEBUG_MODE PRINT_MESG("edgeEnhance: No More Memory!!\n");
00782         vp.state = JBXL_GRAPH_MEMORY_ERROR;
00783         return vp;
00784     }
00785 
00786     la = Laplacian<R>(gd, mode);  
00787     for (i=0; i<vp.xs*vp.ys*vp.zs; i++) {
00788         vp.gp[i] = gd.gp[i] - la.gp[i];
00789     }
00790     la.free();
00791     
00792     return vp;
00793 }
00794 
00795 
00806 template <typename T>  MSGraph<T>  medianFilter(MSGraph<T> xp, int ms=3) 
00807 {
00808     int   i, j, x, y, z, cx;
00809     int   xx, yy, zz, cw, ux, mz;
00810     int   kc, xc, zc, xs, ps;
00811     T*    me;
00812     MSGraph<T> vp;
00813 
00814     mz = Min(ms, xp.zs);
00815     me = (T*)malloc(ms*ms*mz*sizeof(T));
00816 
00817     vp.mimicry(xp);
00818     if (vp.isNull()) {
00819         free(me);
00820         DEBUG_MODE PRINT_MESG("medianFilter: No More Memory!!\n");
00821         vp.state = JBXL_GRAPH_MEMORY_ERROR;
00822         return vp;
00823     }
00824 
00825     kc = ms*ms*mz/2;
00826     xc = ms/2;
00827     zc = mz/2;
00828     xs = xp.xs;
00829     ps = xp.xs*xp.ys;
00830     z  = xp.zs/2;
00831     for(y=xc; y<xp.ys-xc; y++) 
00832     for(x=xc; x<xp.xs-xc; x++) {
00833         cx = z*ps + y*xs + x;
00834         i  = 0;
00835         for (zz=-zc; zz<=zc; zz++)
00836         for (yy=-xc; yy<=xc; yy++)
00837         for (xx=-xc; xx<=xc; xx++) {
00838             cw = cx + xx + yy*xs + zz*ps;
00839             me[i++] = xp.gp[cw];
00840         }
00841         for (i=0; i<ms*ms*mz-1; i++) 
00842         for (j=i+1; j<ms*ms*mz; j++) {
00843             if (me[i]<me[j]) {
00844                 ux    = me[i];
00845                 me[i] = me[j];
00846                 me[j] = ux;
00847             }
00848         }
00849         vp.gp[cx-z*ps] = me[kc];
00850     }
00851 
00852     free(me);
00853     return vp;
00854 }
00855 
00856 
00869 template <typename T>  MSGraph<int> euclidDistance(MSGraph<T> vp, int bc, int& rr)
00870 {
00871     int  i, j, k, l, df, d, w;
00872     int  rmax, rstart, rend;
00873     int  nx, ny, nz, pl;
00874 
00875     rr = -1;
00876     MSGraph<int>  pp(vp.xs, vp.ys, vp.zs, (int)vp.zero, (int)vp.base, vp.RZxy);
00877     if (pp.isNull()) {
00878         DEBUG_MODE PRINT_MESG("euclidDistance: No More Memory!! E1\n");
00879         pp.state = JBXL_GRAPH_MEMORY_ERROR;
00880         return pp;
00881     }
00882 
00883     for (i=0; i<vp.xs*vp.ys*vp.zs; i++) {
00884          if (vp.gp[i]>=bc) pp.gp[i] = 1;
00885          else              pp.gp[i] = 0;
00886     }
00887 
00888     pl = vp.xs*vp.ys;
00889 
00890     for (k=0; k<vp.zs; k++) {
00891         nz = k*pl;
00892         for (j=0; j<vp.ys; j++) {
00893             df = vp.xs;
00894             ny = nz + j*vp.xs;
00895             for (i=0; i<vp.xs; i++) {
00896                 nx = ny + i;
00897                 if (pp.gp[nx]!=0) df = df + 1;
00898                 else              df = 0;
00899                 pp.gp[nx] = df*df;
00900             }
00901         }
00902     }
00903         
00904     for (k=0; k<vp.zs; k++) {
00905         nz = k*pl;
00906         for (j=0; j<vp.ys; j++) {
00907             df = vp.xs;
00908             ny = nz + j*vp.xs;
00909             for (i=vp.xs-1; i>=0; i--) {
00910                 nx = ny + i;
00911                 if (pp.gp[nx]!=0) df = df + 1;
00912                 else              df = 0;
00913                 pp.gp[nx] = Min(pp.gp[nx], df*df);
00914             }
00915         }
00916     }
00917 
00918     rmax = Max(vp.ys, vp.zs);
00919     MSGraph<int>  buf(rmax);
00920     if (buf.isNull()) {
00921         pp.free();
00922         DEBUG_MODE PRINT_MESG("euclidDistance: No More Memory!! E2\n");
00923         pp.state = JBXL_GRAPH_MEMORY_ERROR;
00924         return pp;
00925     }
00926 
00927     for (k=0; k<vp.zs; k++) {
00928         nz = k*pl;
00929         for (i=0; i<vp.xs; i++) {
00930             nx = nz + i;
00931             for (j=0; j<vp.ys; j++)  buf.gp[j] = pp.gp[nx+j*vp.xs];
00932             for (j=0; j<vp.ys; j++) {
00933                 ny = nx + j*vp.xs;
00934                 d = buf.gp[j];
00935                 if (d!=0) {
00936                     rmax   = (int)sqrt((double)d) + 1;
00937                     rstart = Min(rmax, j);
00938                     rend   = Min(rmax, vp.ys-j-1);
00939                     for (l=-rstart; l<=rend; l++) {
00940                         w = buf.gp[j+l] + l*l;
00941                         if (w<d) d = w;
00942                     }
00943                 }
00944                 pp.gp[ny] = d;
00945             }
00946         }
00947     }
00948     buf.clear();
00949 
00950     rr = 0;
00951     for (j=0; j<vp.ys; j++) {
00952         ny = j*vp.xs;
00953         for (i=0; i<vp.xs; i++) {
00954             nx = ny + i;
00955             for (k=0; k<vp.zs; k++)  buf.gp[k] = pp.gp[nx+k*pl];
00956             for (k=0; k<vp.zs; k++) {
00957                 nz = nx + k*pl;
00958                 d = buf.gp[k];
00959                 if (d!=0) {
00960                     rmax   = (int)sqrt((double)d) + 1;
00961                     rstart = Min(rmax, k);
00962                     rend   = Min(rmax, vp.zs-k-1);
00963                     for (l=-rstart; l<=rend; l++) {
00964                         w = buf.gp[k+l] + l*l;
00965                         if (w<d) d = w;
00966                     }
00967                     rr = Max(rr, d);
00968                 }
00969                 pp.gp[nz] = d;
00970             }
00971         }
00972     }
00973     buf.free();
00974 
00975     return pp;
00976 }
00977 
00978 
00979 
00981 
00982 
00983 
00984 #define   FILTER_NON        0   
00985 #define   FILTER_ABS        1   
00986 #define   FILTER_MINMAX     2   
00987 #define   FILTER_NORM       3   
00988 
00989 
00990 
00991 
00992 
00993 template <typename R, typename T> MSGraph<R>  MSMaskFilter(MSGraph<R> vp, MSGraph<T> filter, int mode=FILTER_NON)
00994 {
00995     MSGraph<R> xp;
00996 
00997     if (vp.xs<filter.xs || vp.ys<filter.ys || vp.zs<filter.zs) {
00998         DEBUG_MODE PRINT_MESG("MSMaskFilter: Error: mismach filter dimension!!\n");
00999         xp.state = JBXL_GRAPH_NODATA_ERROR;
01000         return xp;
01001     }
01002     if (filter.norm==0.0) {
01003         DEBUG_MODE PRINT_MESG("MSMaskFilter: Error: norm of filter is zero!!\n");
01004         xp.state = JBXL_GRAPH_NODATA_ERROR;
01005         return xp;
01006     }
01007 
01008     xp.mimicry(vp);
01009 
01010     int xs = filter.xs/2;
01011     int ys = filter.ys/2;
01012     int zs = filter.zs/2;
01013 
01014     for (int k=zs; k<xp.zs-zs; k++) {
01015         for (int j=ys; j<xp.ys-ys; j++) {
01016             for (int i=xs; i<xp.xs-xs; i++) {
01017 
01018                 T conv = (T)0;
01019                 for (int n=-zs; n<=zs; n++) {
01020                     for (int m=-ys; m<=ys; m++) {
01021                         for (int l=-xs; l<=xs; l++) {
01022                             conv += filter.point(xs+l, ys+m, zs+n) * vp.point(i+l, j+m, k+n);
01023                         }
01024                     }
01025                 }
01026 
01027                 R pt = (R)(conv/filter.norm);
01028 
01029                 if (mode==FILTER_ABS && pt<(R)0) pt = -pt;
01030                 else if (mode==FILTER_MINMAX) {
01031                     if (pt<(R)vp.min)      pt = (R)vp.min;
01032                     else if (pt>(R)vp.max) pt = (R)vp.max;
01033                 }
01034                 xp.point(i, j, k) = pt;
01035             }
01036         }
01037     }
01038 
01039     xp.get_minmax();
01040     if (mode==FILTER_NORM && xp.max!=xp.min) {
01041         for (int i=0; i<xp.xs*xp.ys*xp.zs; i++) {
01042             xp.gp[i] = (R)(((T)(xp.gp[i]-xp.min)*(vp.max-vp.min))/(xp.max-xp.min) + vp.min);
01043         }
01044         xp.get_minmax();
01045     }
01046 
01047     return xp;
01048 }
01049 
01050 
01051 }       
01052 
01053 
01054 
01055 #endif
01056  
01057