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 }