[Tex/LaTex] Asymptote Shading Gradient in HSV Color Space

asymptoteshading

Using asymptote I'm trying to fill shapes with gradient shading in the HSV color space. Unfortunately, I think that HSV is not an available color space in asymptote. However, asymptote does have the hsv function that returns a pen in the RGB color space. I've used the following code to produce the two squares as shown.

unitsize(1inch);

// left square
pen p1 = hsv(240,1,1); // blue
pen p2 = hsv(  0,1,1); // red
axialshade(unitsquare, p1, (0,0), p2, (0,1));

// right square
real hband = 0.05;
for (real y = 0.0; y < 1.0; y += hband)
{
    fill(shift(1.2,y)*scale(1,hband)*unitsquare, hsv((1.0-y)*240,1,1));
}

The axialshade function is producing a gradient in the RGB color space on the left. The right square illustrates the HSV gradient that I want. However, it is produced manually by filling bands with solid HSV colors. Is there a method to automatically produce a HSV gradient?

enter image description here

EDIT: I see in comments at this question from 2012 that this color model is not supported by PDF. If true, that probably means that I'm asking for the impossible.

Best Answer

Thank you @CharlesStaats for your great tip regarding the latticeshade function.

After doing more reading at Wikipedia I learned that the HSV color space consists simply of an RGB linear interpolation between the color sequence red--yellow--green--cyan--blue--magenta--red. Trimming that sequence to fit my need gives the following code.

unitsize(1inch);

// left square
pen[][] pens = { {red}, {yellow}, {green}, {cyan}, {blue} };
latticeshade(unitsquare, pens);

// right square
real hband = 0.05;
for (real y = 0.0; y < 1.0; y += hband)
{
    fill(shift(1.2,y)*scale(1,hband)*unitsquare, hsv((1.0-y)*240,1,1));
}

enter image description here