inline float_type interpolation_wrapper(float_type * buffer, index_type index) { /* the compiler will optimize this */ switch (interpolation) { case 0: // no interpolation { std::size_t table_index = std::size_t(std::floor(index)); return buffer[table_index]; } case 1: // linear interpolation { return linearinterp(buffer, index); } case 3: // cubic interpolation (use heremite interpolation) { return cubicinterp(buffer, index); } default: { const uint interpolation_points = interpolation + 1; std::size_t offset = std::size_t(std::floor(index)); return interpolate<interpolation_points>(buffer + offset, index - offset); } } }
inline value_type linearinterp(value_type * buffer, index_type index) { std::size_t left_index = std::size_t(std::floor(index)); std::size_t right_index = left_index + 1; index_type frac_pos = index - left_index; return linearinterp(frac_pos, buffer[left_index], buffer[right_index]); }
VOID DrawLerpFunction(HDC hDC,int startX,int endX,int startY,int endY,int elements,double power) { MoveToEx(hDC,startX,startY,NULL); LineTo(hDC,endX,startY); for(unsigned int i = startX; i <= endX; i += 8) { MoveToEx(hDC,i,startY + 2,NULL); LineTo(hDC,i,startY - 3); } MoveToEx(hDC,startX,startY,NULL); LineTo(hDC,startX,endY); for(unsigned int i = endY; i <= startY; i += 8) { MoveToEx(hDC,startX + 2,i,NULL); LineTo(hDC,startX - 3,i); } WCHAR text[256]; wsprintf(text,L"Linear (Power %g)",power); RECT rect = {startX+10,endY,0,0}; DrawText(hDC,text,-1,&rect,DT_NOCLIP); HGDIOBJ old = SelectObject(hDC,CreatePen(PS_DOT,1,RGB(192,192,192))); for(int i = 0; i < elements; i += 16) { MoveToEx(hDC,double(startX) + double(endX - startX) / double(elements) * double(i),startY,NULL); LineTo(hDC,double(startX) + double(endX - startX) / double(elements) * double(i),double(startY) + double(endY - startY) * linearinterp(0.0,1.0,double(i)/double(elements),power)); } DeleteObject(SelectObject(hDC,old)); for(int i = 0; i < elements; ++i) { MoveToEx(hDC,double(startX) + double(endX - startX) / double(elements) * double(i),double(startY) + double(endY - startY) * linearinterp(0.0,1.0,double(i)/double(elements),power),NULL); LineTo(hDC,double(startX) + double(endX - startX) / double(elements) * double(i+1),double(startY) + double(endY - startY) * linearinterp(0.0,1.0,double(i+1)/double(elements),power)); } }