Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

Trilinear Class Reference

#include <ray.h>

Inheritance diagram for Trilinear:

Ray FirstHitTRI AverageTRI MaxIntensityTRI XRayTRI List of all members.

Public Methods

 Trilinear ()
bool CastNext ()

Protected Methods

Color CalcColorTrilinear (VECTOR pos)
gradient_t CalcGradTrilinear (VECTOR pos)
float CalcAlphaTrilinear (VECTOR pos)
Color Lighting (Color color)

Constructor & Destructor Documentation

Trilinear::Trilinear   [inline]
 

Definition at line 71 of file ray.h.

00071 {};


Member Function Documentation

float Trilinear::CalcAlphaTrilinear VECTOR    pos [protected]
 

Definition at line 149 of file ray.cpp.

References Data::GetDensity(), Transfunc::GetOpacity(), Ray::m_data, Ray::m_tf, VECTOR::x, VECTOR::y, and VECTOR::z.

Referenced by FirstHitTRI::CastNext(), and CastNext().

00149                                         {
00150 
00151         float a000 = m_tf->GetOpacity(m_data->GetDensity(floorf(pos.x),floorf(pos.y),floorf(pos.z)));
00152         float a001 = m_tf->GetOpacity(m_data->GetDensity(floorf(pos.x),floorf(pos.y),ceilf(pos.z)));
00153         float a010 = m_tf->GetOpacity(m_data->GetDensity(floorf(pos.x),ceilf(pos.y),floorf(pos.z)));
00154         float a011 = m_tf->GetOpacity(m_data->GetDensity(floorf(pos.x),ceilf(pos.y),ceilf(pos.z)));
00155         float a100 = m_tf->GetOpacity(m_data->GetDensity(ceilf(pos.x),floorf(pos.y),floorf(pos.z)));
00156         float a101 = m_tf->GetOpacity(m_data->GetDensity(ceilf(pos.x),floorf(pos.y),ceilf(pos.z)));
00157         float a110 = m_tf->GetOpacity(m_data->GetDensity(ceilf(pos.x),ceilf(pos.y),floorf(pos.z)));
00158         float a111 = m_tf->GetOpacity(m_data->GetDensity(ceilf(pos.x),ceilf(pos.y),ceilf(pos.z)));
00159 
00160         float difX = abs(pos.x - floorf(pos.x));
00161         float difY = abs(pos.y - floorf(pos.y));
00162         float difZ = abs(pos.z - floorf(pos.z));
00163 
00164         float aA = a000*difX + a100*abs(1.0f-difX);
00165         float aB = a010*difX + a110*abs(1.0f-difX);
00166         float aC = a011*difX + a111*abs(1.0f-difX);
00167         float aD = a001*difX + a101*abs(1.0f-difX);
00168 
00169         float aE = aA*difZ + aD*abs(1.0f-difZ);
00170         float aF = aB*difZ + aC*abs(1.0f-difZ);
00171 
00172         float a = aE*difY + aF*abs(1.0f-difY);
00173         return a;
00174 }

Color Trilinear::CalcColorTrilinear VECTOR    pos [protected]
 

Definition at line 204 of file ray.cpp.

References Data::GetDensity(), Transfunc::GetDensityColor(), Ray::m_data, Ray::m_tf, VECTOR::x, VECTOR::y, and VECTOR::z.

Referenced by FirstHitTRI::CastNext(), and CastNext().

00204                                         {
00205         Color col000 = m_tf->GetDensityColor(m_data->GetDensity(floorf(pos.x),floorf(pos.y),floorf(pos.z)));
00206         Color col001 = m_tf->GetDensityColor(m_data->GetDensity(floorf(pos.x),floorf(pos.y),ceilf(pos.z)));
00207         Color col010 = m_tf->GetDensityColor(m_data->GetDensity(floorf(pos.x),ceilf(pos.y),floorf(pos.z)));
00208         Color col011 = m_tf->GetDensityColor(m_data->GetDensity(floorf(pos.x),ceilf(pos.y),ceilf(pos.z)));
00209         Color col100 = m_tf->GetDensityColor(m_data->GetDensity(ceilf(pos.x),floorf(pos.y),floorf(pos.z)));
00210         Color col101 = m_tf->GetDensityColor(m_data->GetDensity(ceilf(pos.x),floorf(pos.y),ceilf(pos.z)));
00211         Color col110 = m_tf->GetDensityColor(m_data->GetDensity(ceilf(pos.x),ceilf(pos.y),floorf(pos.z)));
00212         Color col111 = m_tf->GetDensityColor(m_data->GetDensity(ceilf(pos.x),ceilf(pos.y),ceilf(pos.z)));
00213 
00214 
00215         float difX = abs(pos.x - floorf(pos.x));
00216         float difY = abs(pos.y - floorf(pos.y));
00217         float difZ = abs(pos.z - floorf(pos.z));
00218 
00219         Color colA = col000*difX + col100*abs(1.0f-difX);
00220         Color colB = col010*difX + col110*abs(1.0f-difX);
00221         Color colC = col011*difX + col111*abs(1.0f-difX);
00222         Color colD = col001*difX + col101*abs(1.0f-difX);
00223 
00224         Color colE = colA*difZ + colD*abs(1.0f-difZ);
00225         Color colF = colB*difZ + colC*abs(1.0f-difZ);
00226 
00227         Color col = colE*difY + colF*abs(1.0f-difY);
00228         return col;
00229 }

gradient_t Trilinear::CalcGradTrilinear VECTOR    pos [protected]
 

Definition at line 177 of file ray.cpp.

References Data::CalcGrad(), Ray::m_data, VECTOR::x, VECTOR::y, and VECTOR::z.

Referenced by Lighting().

00177                                        {
00178         gradient_t grad000 = m_data->CalcGrad(floorf(pos.x),floorf(pos.y),floorf(pos.z));
00179         gradient_t grad001 = m_data->CalcGrad(floorf(pos.x),floorf(pos.y),ceilf(pos.z));
00180         gradient_t grad010 = m_data->CalcGrad(floorf(pos.x),ceilf(pos.y),floorf(pos.z));
00181         gradient_t grad011 = m_data->CalcGrad(floorf(pos.x),ceilf(pos.y),ceilf(pos.z));
00182         gradient_t grad100 = m_data->CalcGrad(ceilf(pos.x),floorf(pos.y),floorf(pos.z));
00183         gradient_t grad101 = m_data->CalcGrad(ceilf(pos.x),floorf(pos.y),ceilf(pos.z));
00184         gradient_t grad110 = m_data->CalcGrad(ceilf(pos.x),ceilf(pos.y),floorf(pos.z));
00185         gradient_t grad111 = m_data->CalcGrad(ceilf(pos.x),ceilf(pos.y),ceilf(pos.z));
00186 
00187         float difX = abs(pos.x - floorf(pos.x));
00188         float difY = abs(pos.y - floorf(pos.y));
00189         float difZ = abs(pos.z - floorf(pos.z));
00190 
00191         gradient_t gradA = grad000*difX + grad100*abs(1.0f-difX);
00192         gradient_t gradB = grad010*difX + grad110*abs(1.0f-difX);
00193         gradient_t gradC = grad011*difX + grad111*abs(1.0f-difX);
00194         gradient_t gradD = grad001*difX + grad101*abs(1.0f-difX);
00195 
00196         gradient_t gradE = gradA*difZ + gradD*abs(1.0f-difZ);
00197         gradient_t gradF = gradB*difZ + gradC*abs(1.0f-difZ);
00198 
00199         gradient_t grad = gradE*difY + gradF*abs(1.0f-difY);
00200         return grad;
00201 }

bool Trilinear::CastNext   [virtual]
 

Reimplemented from Ray.

Reimplemented in FirstHitTRI, MaxIntensityTRI, XRayTRI, and AverageTRI.

Definition at line 254 of file ray.cpp.

References CalcAlphaTrilinear(), CalcColorTrilinear(), VECTOR::length(), Lighting(), Ray::m_alpha, Ray::m_backgroundcolor, Ray::m_currentcolor, Ray::m_currentpos, Ray::m_data, Ray::m_direction, Ray::m_radius, Ray::m_startpoint, Ray::m_steplength, Ray::m_tf, Ray::mx, Ray::my, Ray::mz, VECTOR::x, VECTOR::y, and VECTOR::z.

00254                     {
00255         
00256         if(m_data == NULL) return false;
00257         if(m_tf == NULL) return false;
00258         
00259         int step_count = 0;
00260         bool first = true;
00261         VECTOR distancetomidpoint = VECTOR(mx/2.0f,my/2.0f,mz/2.0f)-m_currentpos;
00262         int steps = (int)((distancetomidpoint.length() + m_radius)/m_steplength);
00263         
00264         do {
00265                 if(m_alpha > 0.99) break;
00266                 if((m_currentpos.x >= 0.0)&&(m_currentpos.y >= 0.0)&&(m_currentpos.z >= 0.0)&&(m_currentpos.x < mx)&&(m_currentpos.y < my)&&(m_currentpos.z < mz)) {
00267                         if(first) {
00268                                 m_startpoint = VECTOR(m_currentpos.x,m_currentpos.y,m_currentpos.z);
00269                                 first = false;
00270                         }
00271                         Color help_color = CalcColorTrilinear(m_currentpos);
00272                         float help_alpha = CalcAlphaTrilinear(m_currentpos);
00273                         // lightning:
00274                         help_color = Lighting(help_color);
00275                         // calculate new currentcolor:
00276                         m_currentcolor += help_color*(1-m_alpha)*help_alpha;
00277                         // calculate new alphavalue
00278                         m_alpha += (1-m_alpha)*help_alpha;
00279                 }
00280                 // calculate new position
00281                 m_currentpos += m_steplength*m_direction;
00282                 
00283                 step_count++;
00284         }while(step_count <= steps);
00285         if(m_alpha < 1.0 ) {
00286                 m_currentcolor += m_backgroundcolor*(1.0-m_alpha);
00287         }
00288         return true;
00289 }

Color Trilinear::Lighting Color    color [protected, virtual]
 

Reimplemented from Ray.

Definition at line 233 of file ray.cpp.

References CalcGradTrilinear(), VECTOR::dot(), VECTOR::length(), Ray::m_ambient, Ray::m_currentpos, Ray::m_diffuse, Ray::m_direction, Ray::m_highlight, Ray::m_lightpos, Ray::m_specular, Ray::m_startpoint, VECTOR::normalize(), gradient_t::x, gradient_t::y, and gradient_t::z.

Referenced by FirstHitTRI::CastNext(), and CastNext().

00233                                {
00234         gradient_t g = CalcGradTrilinear(m_currentpos);
00235         VECTOR normal = VECTOR(g.x, g.y, g.z);
00236         normal.normalize(); // normalize normal
00237         
00238         VECTOR len = m_currentpos-m_startpoint;
00239         Color ret;
00240         if(m_light) {
00241                 VECTOR v = -m_direction;
00242                 v.normalize();
00243                 VECTOR l = m_lightpos-m_currentpos;
00244                 l.normalize();
00245                 VECTOR h = (v+l);
00246                 h.normalize(); 
00247                 ret = color*m_ambient + color*((m_diffuse*(normal.dot(m_direction))) + (m_specular*pow(normal.dot(h),m_highlight)))+ color/(4.0f+1000000.0f*len.length()); 
00248         }
00249         else ret = color*m_ambient + color*(m_diffuse*(normal.dot(m_direction))) + color/(4.0f+1000000.0f*len.length());
00250         return ret;
00251 }


The documentation for this class was generated from the following files:
Generated on Thu Jan 23 12:32:17 2003 by doxygen1.3-rc2