TuttleOFX  1
TetraInterpolator.cpp
Go to the documentation of this file.
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 };