Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Class Members | File Members | Related Pages

vptable.cpp

Go to the documentation of this file.
00001 
00002 //deprecated
00004 //
00005 //  PROJECT.....: vpat - Creating Virtual Patients
00006 //  RESPONSIBLE.: Carla Freitas e Luciana Nedel
00007 //
00008 //  FILE........: vptable.cpp
00009 //  DESCRIPTION.: Contain the VPTable class implementation.
00010 //
00011 //  AUTHOR......: Isabel Harb Manssour
00012 //  DATE........: July/19/2000
00013 //  DESCRIPTION.: Implementation of class methods.
00014 //
00015 //  AUTHOR......: Isabel Harb Manssour
00016 //  DATE........: June/05/2001
00017 //  DESCRIPTION.: Implementation of new methods.
00018 //
00020 
00021 #include <vptable.h>
00022 #include <cmath>
00023 
00024 
00026 // Description: Class "VPTable" constructor without parameter. Sets
00027 //              initial values for the attributes.
00028 // Parameters.: -
00029 // Return.....: -
00030 
00031 VPTable::VPTable () {
00032 
00033     int i=0, r=0, g=0, b=0;
00034 
00035 
00037     // Set opacity table
00038     minVolumeDensity = 0;
00039     maxVolumeDensity = 255;
00040 
00041 
00043     // Default control points initialization
00044     numControlPoints=0;
00045     controlPoints[numControlPoints] = 0;
00046     colorControlPoints[numControlPoints].vpSetColor(0,0,0,0);
00047     numControlPoints++;
00048     controlPoints[numControlPoints] = 25;
00049     colorControlPoints[numControlPoints].vpSetColor(0,0,0,0);
00050     numControlPoints++;
00051     controlPoints[numControlPoints] = 80;
00052     colorControlPoints[numControlPoints].vpSetColor(220,160,90,0);
00053     numControlPoints++;
00054     controlPoints[numControlPoints] = 210;
00055     colorControlPoints[numControlPoints].vpSetColor(255,0,0,0);
00056     numControlPoints++;
00057     controlPoints[numControlPoints] = 255;
00058     colorControlPoints[numControlPoints].vpSetColor(255,255,255,0);
00059     
00060 
00062     // Set a default opacity table
00063     for (i=0; i<DIM; i++) {
00064         if (i==controlPoints[0])
00065             opacity[i] = (float) 0;     
00066         else if (i<controlPoints[1])
00067             opacity[i] = ( 0.01 * i) / 25;
00068         else if (i<controlPoints[2])
00069             opacity[i] = ( (0.15-0.01) * (i-25) ) / (80-25) + 0.01;
00070         else if (i<controlPoints[3])
00071             opacity[i] = ( (0.95-0.15) * (i-80) ) / (210-80) + 0.15;
00072         else if (i<controlPoints[4]) 
00073             opacity[i] = ( (1.0-0.95) * (i-210) ) / (255-210) + 0.95;
00074         else 
00075             opacity[i] = (float) 1;
00076     } // for
00077 
00078 
00080     // Set a default color table
00081     for (i=0; i<DIM; i++) {
00082 
00083         if (i<controlPoints[1]) {
00084             colors[i].vpSetColor(0,0,0,0); // preto     
00085         }
00086         else if (i<controlPoints[2]) {                  
00087             r = ( (220-0) * (i-25) ) / (80-25) + 0;
00088             g = ( (160-0) * (i-25) ) / (80-25) + 0;
00089             b = ( (90-0) * (i-25) ) / (80-25) + 0;
00090             colors[i].vpSetColor(r,g,b,0); // bege 
00091         }
00092         else if (i<controlPoints[3]) {
00093             r = ( (255-220) * (i-80) ) / (210-80) + 220;
00094             g = ( (0-160) * (i-80) ) / (210-80) + 160;
00095             b = ( (0-90) * (i-80) ) / (210-80) + 90;
00096             colors[i].vpSetColor(r,g,b,0); // vermelho
00097         }
00098         else if (i<controlPoints[4]) {
00099             r = (int) ( (255-255) * (i-210) ) / (255-210) + 255;
00100             g = (int) ( (255-0) * (i-210) ) / (255-210) + 0;
00101             b = (int) ( (255-0) * (i-210) ) / (255-210) + 0;
00102             colors[i].vpSetColor(r,g,b,0);
00103         }
00104         else 
00105             colors[i].vpSetColor(255,255,255,0); // branco;
00106 
00107 // bege ou rosa?? 255,192,203
00108 // bege = 220 160 90
00109     }
00110 
00111 
00112 /*  
00114     // Default control points initialization
00115     numControlPoints=0;
00116     controlPoints[numControlPoints] = 0;
00117     numControlPoints++;
00118     controlPoints[numControlPoints] = 25;
00119     numControlPoints++;
00120     controlPoints[numControlPoints] = 90;
00121     numControlPoints++;
00122     controlPoints[numControlPoints] = 100;
00123     numControlPoints++;
00124     controlPoints[numControlPoints] = 110;
00125     numControlPoints++;
00126     controlPoints[numControlPoints] = 130;
00127     numControlPoints++;
00128     controlPoints[numControlPoints] = 140;
00129     numControlPoints++;
00130     controlPoints[numControlPoints] = 150;
00131     numControlPoints++;
00132     controlPoints[numControlPoints] = 160;
00133     numControlPoints++;
00134     controlPoints[numControlPoints] = 170;
00135     numControlPoints++;
00136     controlPoints[numControlPoints] = 180;
00137     numControlPoints++;
00138     controlPoints[numControlPoints] = 200;
00139     numControlPoints++;
00140     controlPoints[numControlPoints] = 255;
00141     
00142 
00144     // Set a default opacity table
00145     for (i=0; i<DIM; i++) {
00146         if (i==controlPoints[0])
00147             opacity[i] = (float) 0;     
00148         else if (i<controlPoints[1])
00149             opacity[i] = ( 0.1 * i) / 25;
00150         else if (i<controlPoints[2])
00151             opacity[i] = ( (0.28-0.1) * (i-25) ) / (90-25) + 0.1;
00152         else if (i<controlPoints[3])
00153             opacity[i] = ( (0.31-0.28) * (i-90) ) / (100-90) + 0.28;
00154         else if (i<controlPoints[4])
00155             opacity[i] = ( (0.37-0.31) * (i-100) ) / (110-100) + 0.31;
00156         else if (i<controlPoints[5])
00157             opacity[i] = ( (0.43-0.37) * (i-110) ) / (130-110) + 0.37;
00158         else if (i<controlPoints[6])
00159             opacity[i] = ( (0.49-0.43) * (i-130) ) / (140-130) + 0.43;
00160         else if (i<controlPoints[7])
00161             opacity[i] = ( (0.55-0.49) * (i-140) ) / (150-140) + 0.49;
00162         else if (i<controlPoints[8])
00163             opacity[i] = ( (0.62-0.55) * (i-150) ) / (160-150) + 0.55;
00164         else if (i<controlPoints[9])
00165             opacity[i] = ( (0.67-0.62) * (i-160) ) / (170-160) + 0.62;
00166         else if (i<controlPoints[10])
00167             opacity[i] = ( (0.73-0.67) * (i-170) ) / (180-170) + 0.67;
00168         else if (i<controlPoints[11])
00169             opacity[i] = ( (0.88-0.73) * (i-180) ) / (200-180) + 0.73;
00170         else if (i<controlPoints[12]) 
00171             opacity[i] = ( (0.95-0.88) * (i-200) ) / (255-200) + 0.88;
00172         else 
00173             opacity[i] = (float) 1;
00174 */
00175     
00176 
00177 
00178 
00179 /*
00180         if ( (i>25) && (i<90) ) 
00181             opacity[i] = (float) 0.28;
00182         else if ( (i>=90) && (i<100) ) 
00183             opacity[i] = (float) 0.31;
00184         else if ( (i>=100) && (i<110) ) 
00185             opacity[i] = (float) 0.37;
00186         else if ( (i>=110) && (i<130) ) 
00187             opacity[i] = (float) 0.43;
00188         else if ( (i>=130) && (i<140) ) 
00189             opacity[i] = (float) 0.49;
00190         else if ( (i>=140) && (i<150) ) 
00191             opacity[i] = (float) 0.55;
00192         else if ( (i>=150) && (i<160) ) 
00193             opacity[i] = (float) 0.62;
00194         else if ( (i>=160) && (i<170) ) 
00195             opacity[i] = (float) 0.67;
00196         else if ( (i>=170) && (i<180) ) 
00197             opacity[i] = (float) 0.73;
00198         else if ( (i>=180) && (i<200) )
00199             opacity[i] = (float) 0.88;
00200         else if (i>=200)
00201             opacity[i] = (float) 0.94;
00202         else
00203             opacity[i] = (float) 0;
00204 */
00205 
00206 
00207 
00208 
00209 /*
00210         if ( (i>20) && (i<50) ) 
00211             opacity[i] = (float) 0.2;
00212         else if ( (i>=50) && (i<90) ) 
00213             opacity[i] = (float) 0.3;
00214         else if ( (i>=100) && (i<130) ) 
00215             opacity[i] = (float) 0.3;
00216         else if ( (i>=130) && (i<160) ) 
00217             opacity[i] = (float) 0.4;
00218         else if ( (i>=130) && (i<140) ) 
00219             opacity[i] = (float) 0.49;
00220         else if ( (i>=180) && (i<190) ) 
00221             opacity[i] = (float) 0.7;
00222         else if ( (i>=190) && (i<200) ) 
00223             opacity[i] = (float) 0.75;
00224         else if ( (i>=200) && (i<210) ) 
00225             opacity[i] = (float) 0.8;
00226         else if ( (i>=210) && (i<220) )
00227             opacity[i] = (float) 0.85;
00228         else if ( (i>=220) && (i<230) )
00229             opacity[i] = (float) 0.9;
00230         else if (i>=230)
00231             opacity[i] = (float) 1.0;
00232         else
00233             opacity[i] = (float) 0;
00234 */
00235 
00236 
00237 /*
00238         if ( (i>=190) && (i<215) ) 
00239             opacity[i] = (float) 0.8;
00240         else if ( (i>=216) && (i<230) ) 
00241             opacity[i] = (float) 0.9;
00242         else if ( (i>=231) && (i<243) ) 
00243             opacity[i] = (float) 0.95;
00244         else if ( i>=243 ) 
00245             opacity[i] = (float) 1.0;
00246         else
00247             opacity[i] = (float) 0;
00248 */  
00249 
00250 
00251 /*
00252         if ( (i>=120) && (i<130) ) 
00253             opacity[i] = (float) 0.38;
00254         else if ( (i>=130) && (i<140) ) 
00255             opacity[i] = (float) 0.48;
00256         else if ( (i>=140) && (i<150) ) 
00257             opacity[i] = (float) 0.58;
00258         else if ( (i>=150) && (i<160) ) 
00259             opacity[i] = (float) 0.65;
00260         else if ( (i>=160) && (i<170) ) 
00261             opacity[i] = (float) 0.78;
00262         else if ( i>=170 ) 
00263             opacity[i] = (float) 0.98;
00264         else
00265             opacity[i] = (float) 0;
00266 */
00267 
00268 /*
00269         if ( (i>=100) && (i<130) ) 
00270             opacity[i] = (float) 0.1;
00271         else if ( (i>=130) && (i<140) ) 
00272             opacity[i] = (float) 0.13;
00273         else if ( (i>=140) && (i<150) ) 
00274             opacity[i] = (float) 0.18;
00275         else if ( (i>=150) && (i<160) ) 
00276             opacity[i] = (float) 0.28;
00277         else if ( (i>=160) && (i<170) ) 
00278             opacity[i] = (float) 0.38;
00279         else if ( (i>=170) && (i<180) ) 
00280             opacity[i] = (float) 0.48;
00281         else if ( (i>=180) && (i<190) ) 
00282             opacity[i] = (float) 0.92;
00283         else if ( (i>=190) && (i<200) ) 
00284             opacity[i] = (float) 0.98;
00285         else if ( i>=200 ) 
00286             opacity[i] = (float) 1;
00287         else
00288             opacity[i] = (float) 0;
00289 */
00290 
00291 /*
00292         if ( (i>20) && (i<80) ) 
00293             opacity[i] = (float) 0.25;
00294         else if ( (i>=80) && (i<90) ) 
00295             opacity[i] = (float) 0.31;
00296         else if ( (i>=90) && (i<100) ) 
00297             opacity[i] = (float) 0.36;
00298         else if ( (i>=110) && (i<120) ) 
00299             opacity[i] = (float) 0.42;
00300         else if ( (i>=120) && (i<130) ) 
00301             opacity[i] = (float) 0.47;
00302         else if ( (i>=130) && (i<140) ) 
00303             opacity[i] = (float) 0.54;
00304         else if ( (i>=140) && (i<150) ) 
00305             opacity[i] = (float) 0.62;
00306         else if ( (i>=150) && (i<160) ) 
00307             opacity[i] = (float) 0.67;
00308         else if ( (i>=160) && (i<170) ) 
00309             opacity[i] = (float) 0.73;
00310         else if ( i>=170 ) 
00311             opacity[i] = (float) 0.80;
00312         else
00313             opacity[i] = (float) 0;
00314 */
00315 
00316 /*
00317 
00318         if ( (i>=170) && (i<200) )
00319             opacity[i] = (float) 0.7;
00320         else if ( (i>=200) && (i<215) )
00321             opacity[i] = (float) 0.82;
00322         else if ( (i>=215) && (i<230) )
00323             opacity[i] = (float) 0.89;
00324         else if ( (i>=230) && (i<242) )
00325             opacity[i] = (float) 0.94;
00326         else if ( i>=242 )
00327             opacity[i] = (float) 0.99;
00328         else
00329             opacity[i] = (float) 0;
00330 */
00331 
00332 }
00333 
00334 
00336 // Description: Method "vpSetMinVolumeDensity" sends a new  
00337 //              value to the minVolumeDensity attribute 
00338 // Parameters.: int d
00339 // Return.....: -
00340 
00341 void VPTable::vpSetMinVolumeDensity(int d) {
00342     minVolumeDensity = d;
00343 }
00344 
00345 
00347 // Description: Method "vpSetMaxVolumeDensity" sends a new  
00348 //              value to the maxVolumeDensity attribute 
00349 // Parameters.: int d
00350 // Return.....: -
00351 
00352 void VPTable::vpSetMaxVolumeDensity(int d) {
00353     maxVolumeDensity = d;
00354 }
00355 
00356 
00358 // Description: Method "vpProcessMaxGradient" process the maximum
00359 //              gradient in accordance with the min and max volume
00360 //              density. 
00361 // Parameters.: -
00362 // Return.....: -
00363 
00364 void VPTable::vpProcessMaxGradient() {
00365     maxGradient.x = maxGradient.y = 
00366     maxGradient.z = (maxVolumeDensity-minVolumeDensity) * sqrt(3);
00367     //maxGradient.vpNormalize(); // ?!?! Tem ou não que normalizar?
00368 }
00369 
00370 
00372 // Description: Method "vpSetMaxGradient" sends a new value for 
00373 //              the gradient. 
00374 // Parameters.: VPVector3D g, maximum gradient
00375 // Return.....: -
00376 
00377 void  VPTable::vpSetMaxGradient(VPVector3D g) {
00378     maxGradient = g;
00379 }
00380 
00381 
00383 // Description: Method "vpGetLinearOpacityValue" return the opacity  
00384 //              value computed (proportional to the color received).
00385 // Parameters.: unsigned int color
00386 // Return.....: float opacity
00387 
00388 float VPTable::vpGetLinearOpacityValue(float color) {
00389 
00390     if ( color < 40)
00391         return ( (float) 0);
00392     else
00393         return ((float) (color-40) / (float)(maxVolumeDensity-40) );
00394 
00395 /* TESTE PARA O VOLUME "CTHEAD" COM NÍVEIS DE TRANSPARÊNCIA
00396     if ((color > 65) && (color < 85))
00397         return ( (float) 0.06); //color / 255 );
00398     else if (color > 190)
00399         return ( (float) 1.0);//color / 255 );
00400     else 
00401         return ( (float) 0);
00402 */
00403 
00404 }
00405 
00406 
00408 // Description: Method "vpGetTableOpacityValue" return the opacity  
00409 //              value in accordance with the opacity table 
00410 //              (indirect method).
00411 // Parameters.: unsigned int color
00412 // Return.....: float opacity
00413 
00414 float VPTable::vpGetTableOpacityValue(float color) {
00415     return ( opacity[int(color+0.5)] ); // round sample point
00416 }
00417 
00418 
00420 // Description: Method "vpGetGradientOpacityValue" return the opacity  
00421 //              value computed in accordance with the sample 
00422 //              gradient.
00423 // Parameters.: VPVector g
00424 // Return.....: float opacity
00425 
00426 float VPTable::vpGetGradientOpacityValue(int color, VPVector3D g){
00427 
00428 // Obs.: Mais tarde já deixar calculado para poupar tempo
00429 
00430 
00431     // IMPLEMENTAÇÃO DE ACORDO COM A DISSERTAÇÃO DO MRMS
00432     if ( color < 40)
00433         return ( (float) 0);
00434     else
00435         return ( g.vpModule() / maxGradient.vpModule() );
00436 
00437 
00438 /**** 
00439     // IMPLEMENTAÇÃO DE ACORDO COM O LIVRO VOLUME RENDERING (que não funcionou)
00440     float gradientMagnitude = g.vpModule();
00441     float maxGradientMagnitude = maxGradient.vpModule(); 
00442     return ( 1 - ( (maxVolumeDensity-color) / (maxGradientMagnitude*gradientMagnitude) ) );
00443 ****/
00444 
00445 /**** 
00446 // IMPLEMENTAÇÃO DE ACORDO COM O CÓDIGO DO MRMS
00447 
00448     float og = g.vpModule()/maxGradient.vpModule();
00449     float oi = (float) color / maxVolumeDensity;
00450 
00451 //  if (color > 0)
00452 //      printf("x");
00453 //  if ( color < 40)
00454 //      oi = 0;
00455 //  else
00456 //      oi = (float) color / maxVolumeDensity;
00457 
00458     return ( oi + 1.0 * (og - oi) );
00459 ****/
00460 }
00461 
00462 
00464 // Description: Method "vpSetOpacityTable" sends new values for 
00465 //              the opacity table.
00466 // Parameters.: float t[]
00467 // Return.....: -
00468 
00469 void  VPTable::vpSetOpacityTable (float t[]) {
00470     for (int i=0; i<DIM; i++)
00471         opacity[i] = t[i];
00472 } 
00473 
00474 
00476 // Description: Method "vpGetOpacityTable" return the opacity 
00477 //              table.
00478 // Parameters.: -
00479 // Return.....: float opacity (vector with the opacity table)
00480 
00481 float * VPTable::vpGetOpacityTable() {
00482     return opacity;
00483 } 
00484 
00485 
00487 // Description: Method "vpSetColorTable" sends new values for 
00488 //              the color table.
00489 // Parameters.: VPColor c[]
00490 // Return.....: -
00491 
00492 void  VPTable::vpSetColorTable (VPColor c[]){
00493     for (int i=0; i<DIM; i++)
00494         colors[i].vpSetColor(c[i].vpGetR(),c[i].vpGetG(),c[i].vpGetB(),0);
00495 } 
00496 
00497 
00499 // Description: Method "vpGetColorTable" return the color table.
00500 // Parameters.: -
00501 // Return.....: VPColor colors (vector with the color table)
00502 
00503 VPColor * VPTable::vpGetColorTable(){
00504     return colors;
00505 } 
00506 
00507 
00509 // Description: Method "vpSetControlPoints" sends a new value for 
00510 //              the tables control points.
00511 // Parameters.: int cp[], int n
00512 // Return.....: -
00513 
00514 void VPTable::vpSetControlPoints (int cp[], int n) {
00515     int i, j, auxR=0, auxG=0, auxB=0;
00516     numControlPoints = n;
00517     for (i=0; i<=numControlPoints; i++) {
00518         controlPoints[i] = cp[i];
00519         colorControlPoints[i].vpSetColor(colors[cp[i]].vpGetR(),colors[cp[i]].vpGetG(),colors[cp[i]].vpGetB(),0);
00520     }
00521 
00522     // Color table update in accordance with the new control points
00523     for (i=0; i<numControlPoints; i++) {
00524         colors[i].vpSetColor(colorControlPoints[i].vpGetR(), colorControlPoints[i].vpGetG(), colorControlPoints[i].vpGetB(), 0);
00525         for (j=controlPoints[i]+1; j<controlPoints[i+1]; j++) {
00526                 auxR = ( ((colorControlPoints[i].vpGetR() - colorControlPoints[i+1].vpGetR())*(j-controlPoints[i+1])) / (controlPoints[i] - controlPoints[i+1]) ) + colorControlPoints[i+1].vpGetR();
00527                 auxG = ( ((colorControlPoints[i].vpGetG() - colorControlPoints[i+1].vpGetG())*(j-controlPoints[i+1])) / (controlPoints[i] - controlPoints[i+1]) ) + colorControlPoints[i+1].vpGetG();
00528                 auxB = ( ((colorControlPoints[i].vpGetB() - colorControlPoints[i+1].vpGetB())*(j-controlPoints[i+1])) / (controlPoints[i] - controlPoints[i+1]) ) + colorControlPoints[i+1].vpGetB();
00529                 colors[j].vpSetColor(auxR, auxG, auxB, 0);
00530         }
00531     }
00532 
00533 }
00534 
00535 
00537 // Description: Method "vpGetControlPoints" return the tables 
00538 //              control points.
00539 // Parameters.: -
00540 // Return.....: int cp[], int &n
00541 
00542 void VPTable::vpGetControlPoints(int cp[], int &n) {
00543     n = numControlPoints;
00544     for (int i=0; i<=numControlPoints; i++)
00545         cp[i] = controlPoints[i];
00546 
00547 }
00548 
00549 
00551 // Description: Method "vpSetControlPoints" sends a new value for 
00552 //              the tables control points.
00553 // Parameters.: int cp[], VPColor c[], int n
00554 // Return.....: -
00555 
00556 void VPTable::vpSetControlPoints (int cp[], VPColor c[], int n) {
00557     numControlPoints = n;
00558     for (int i=0; i<=numControlPoints; i++) {
00559         controlPoints[i] = cp[i];
00560         colorControlPoints[i].vpSetColor(c[i].vpGetR(),c[i].vpGetG(),c[i].vpGetB(),0);
00561     }
00562 }
00563 
00564 
00566 // Description: Method "vpGetControlPoints" return the tables 
00567 //              control points.
00568 // Parameters.: -
00569 // Return.....: int cp[], VPColor c[], int &n
00570 
00571 void VPTable::vpGetControlPoints(int cp[], VPColor c[], int &n) {
00572     n = numControlPoints;
00573     for (int i=0; i<=numControlPoints; i++) {
00574         cp[i] = controlPoints[i];
00575         c[i].vpSetColor(colorControlPoints[i].vpGetR(),colorControlPoints[i].vpGetG(),colorControlPoints[i].vpGetB(),0);    
00576     }
00577 }
00578 
00579 
00581 // Description: Method "vpGetColor" return the color value  
00582 //              in accordance with the color table.
00583 // Parameters.: float color, interpolated color (density)
00584 // Return.....: VPColor c, color (RGB)
00585 
00586 VPColor VPTable::vpGetColor(float color) {
00587  VPColor c( colors[int(color+0.5)].vpGetR(), colors[int(color+0.5)].vpGetG(), 
00588             colors[int(color+0.5)].vpGetB(), colors[int(color+0.5)].vpGetI());
00589  return ( c ) ;
00590 }

Generated on Tue Sep 6 10:00:07 2005 for VPAT by  doxygen 1.4.4