TuttleOFX
1
|
00001 #include "TetraInterpolator.hpp" 00002 #include "Color.hpp" 00003 #include "AbstractLut.hpp" 00004 00005 #include <cmath> 00006 00007 namespace tuttle { 00008 00009 template<class T> 00010 T clamp( const T v, const T min, const T max ) 00011 { 00012 return std::max(min, std::min( v, max) ); 00013 } 00014 00015 Color TetraInterpolator::interpolate( const AbstractLut* lut, const double x, const double y, const double z ) const 00016 { 00017 const std::size_t dimSize = lut->dimSize(); 00018 00019 const double xc = clamp( x, 0.0, 1.0 ); 00020 const double yc = clamp( y, 0.0, 1.0 ); 00021 const double zc = clamp( z, 0.0, 1.0 ); 00022 const unsigned int x0 = (unsigned int)std::floor( xc * ( dimSize - 1 ) ); 00023 const unsigned int y0 = (unsigned int)std::floor( yc * ( dimSize - 1 ) ); 00024 const unsigned int z0 = (unsigned int)std::floor( zc * ( dimSize - 1 ) ); 00025 00026 // par defaut le pas de la grille est de 1 00027 const unsigned int x1 = x0 + 1; 00028 const unsigned int y1 = y0 + 1; 00029 const unsigned int z1 = z0 + 1; 00030 00031 const Color p000 = lut->getIndexedColor( x0, y0, z0 ); 00032 const Color p001 = lut->getIndexedColor( x0, y0, z1 ); 00033 const Color p010 = lut->getIndexedColor( x0, y1, z0 ); 00034 const Color p011 = lut->getIndexedColor( x0, y1, z1 ); 00035 const Color p100 = lut->getIndexedColor( x1, y0, z0 ); 00036 const Color p101 = lut->getIndexedColor( x1, y0, z1 ); 00037 const Color p110 = lut->getIndexedColor( x1, y1, z0 ); 00038 const Color p111 = lut->getIndexedColor( x1, y1, z1 ); 00039 00040 const double dx = x * ( dimSize - 1.0 ) - (double)x0; 00041 const double dy = y * ( dimSize - 1.0 ) - (double)y0; 00042 const double dz = z * ( dimSize - 1.0 ) - (double)z0; 00043 00044 const Color c0 = p000; 00045 00046 Color c1, c2, c3; 00047 if( dx >= dy && dy >= dz ) // T1 00048 { 00049 c1 = ( p100 - p000 ); c2 = ( p110 - p100 ); c3 = ( p111 - p110 ); 00050 } 00051 else if( dx >= dz && dz >= dy ) // T2 00052 { 00053 c1 = ( p100 - p000 ); c2 = ( p111 - p101 ); c3 = ( p101 - p100 ); 00054 } 00055 else if( dz >= dx && dx >= dy ) // T3 00056 { 00057 c1 = ( p101 - p001 ); c2 = ( p111 - p101 ); c3 = ( p001 - p000 ); 00058 } 00059 else if( dy >= dx && dx >= dz ) // T4 00060 { 00061 c1 = ( p110 - p010 ); c2 = ( p010 - p000 ); c3 = ( p111 - p110 ); 00062 } 00063 else if( dy >= dz && dz >= dx ) // T5 00064 { 00065 c1 = ( p111 - p011 ); c2 = ( p010 - p000 ); c3 = ( p011 - p010 ); 00066 } 00067 else if( dz >= dy && dy >= dx ) // T6 00068 { 00069 c1 = ( p111 - p011 ); c2 = ( p011 - p001 ); c3 = ( p001 - p000 ); 00070 } 00071 c1 *= dx; c2 *= dy; c3 *= dz; 00072 00073 return Color( c0.x + c1.x + c2.x + c3.x, 00074 c0.y + c1.y + c2.y + c3.y, 00075 c0.z + c1.z + c2.z + c3.z ); 00076 } 00077 00078 };