示例#1
0
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);
    }

    }
}
示例#2
0
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]);
}
示例#3
0
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));
    }
}