#include <ray.h>
Inheritance diagram for Trilinear:
Public Methods | |
Trilinear () | |
bool | CastNext () |
Protected Methods | |
Color | CalcColorTrilinear (VECTOR pos) |
gradient_t | CalcGradTrilinear (VECTOR pos) |
float | CalcAlphaTrilinear (VECTOR pos) |
Color | Lighting (Color color) |
|
Definition at line 71 of file ray.h.
00071 {}; |
|
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 } |
|
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 } |
|
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 } |
|
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 } |
|
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 } |