bezier Function

public pure function bezier(colors, levels) result(map)

Create a colormap from continuous Bezier interpolation of control colors

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: colors(:,:)
integer, intent(in), optional :: levels

Return Value integer, allocatable, (:,:)


Calls

proc~~bezier~~CallsGraph proc~bezier bezier proc~factorial factorial proc~bezier->proc~factorial

Called by

proc~~bezier~~CalledByGraph proc~bezier bezier proc~create_bezier Colormap%create_bezier proc~create_bezier->proc~bezier proc~test_027 test_027 proc~test_027->proc~bezier proc~test_028 test_028 proc~test_028->proc~bezier proc~test_029 test_029 proc~test_029->proc~bezier proc~test_030 test_030 proc~test_030->proc~bezier proc~test_031 test_031 proc~test_031->proc~bezier proc~test_032 test_032 proc~test_032->proc~bezier proc~test_033 test_033 proc~test_033->proc~bezier proc~test_047 test_047 proc~test_047->proc~create_bezier proc~test_072 test_072 proc~test_072->proc~create_bezier proc~test_084 test_084 proc~test_084->proc~create_bezier program~check check program~check->proc~test_027 program~check->proc~test_028 program~check->proc~test_029 program~check->proc~test_030 program~check->proc~test_031 program~check->proc~test_032 program~check->proc~test_033 program~check->proc~test_047 program~check->proc~test_072 program~check->proc~test_084 program~create create program~create->proc~create_bezier

Source Code

    pure function bezier(colors, levels) result(map)
        integer, intent(in) :: colors(:,:)
        integer, intent(in), optional :: levels
        integer, allocatable :: map(:,:)
        integer :: order, i, j, levels_, fact_order
        real(wp) :: r, g, b, coeff, t, omt

        ! Set default value for levels
        if (present(levels)) then
            levels_ = levels
        else
            levels_ = 256
        end if

        ! Order of the Bezier curve
        order = size(colors, 1) - 1
        if (order < 1) error stop "Error: At least two control colors are required for Bezier interpolation."

        allocate(map(levels_, 3))
        fact_order = factorial(order)
        do i = 1, levels_
            t = real(i-1, wp) / real(levels_-1, wp)
            omt = 1.0_wp - t
            r = 0.0_wp
            g = 0.0_wp
            b = 0.0_wp
            do j = 0, order
                coeff = real(fact_order, wp)/real(factorial(j)*factorial(order-j), wp)*t**j*omt**(order-j)
                r = r + real(colors(j+1,1), wp) * coeff
                g = g + real(colors(j+1,2), wp) * coeff
                b = b + real(colors(j+1,3), wp) * coeff
            end do
            map(i,1) = min(255, max(0, nint(r)))
            map(i,2) = min(255, max(0, nint(g)))
            map(i,3) = min(255, max(0, nint(b)))
        end do
    end function bezier