如何在libgdx中指定具有色调、饱和度和亮度的颜色

如何在libgdx中指定具有色调、饱和度和亮度的颜色,libgdx,Libgdx,如何在libGDX中使用色调、饱和度和亮度而不是r、g、b、a值指定颜色。我注意到颜色构造函数只接受rgba,至少自动补全只提供rgba。这可能吗?我想创建一个从色调=0到色调=255的渐变。我不认为这是内置在Libgdx中的,除非它是在我上次检查后添加的。我为它做了一个实用的方法。这将色调、饱和度和值视为0到1之间的值。(因此,如果你使用的是刻度,请预先除以255)。对于色调,它从红色到黄色到绿色再到青色再到蓝色再到洋红再回到红色。或者相反的方向,忘记了。我根据Android的颜色类修改了算法

如何在libGDX中使用色调、饱和度和亮度而不是r、g、b、a值指定颜色。我注意到颜色构造函数只接受rgba,至少自动补全只提供rgba。这可能吗?我想创建一个从色调=0到色调=255的渐变。

我不认为这是内置在Libgdx中的,除非它是在我上次检查后添加的。我为它做了一个实用的方法。这将色调、饱和度和值视为0到1之间的值。(因此,如果你使用的是刻度,请预先除以255)。对于色调,它从红色到黄色到绿色再到青色再到蓝色再到洋红再回到红色。或者相反的方向,忘记了。我根据Android的颜色类修改了算法

public static Color setColor (Color target, float hue, float saturation, float value){
        saturation = MathUtils.clamp(saturation, 0.0f, 1.0f);
        hue %= 1f;
        if (hue < 0f) {
            hue++;
        }
        value = MathUtils.clamp(value, 0.0f, 1.0f);

        float red = 0.0f;
        float green = 0.0f;
        float blue = 0.0f;

        final float hf = (hue - (int) hue) * 6.0f;
        final int ihf = (int) hf;
        final float f = hf - ihf;
        final float pv = value * (1.0f - saturation);
        final float qv = value * (1.0f - saturation * f);
        final float tv = value * (1.0f - saturation * (1.0f - f));

        switch (ihf) {
            case 0:         // Red is the dominant color
                red = value;
                green = tv;
                blue = pv;
                break;
            case 1:         // Green is the dominant color
                red = qv;
                green = value;
                blue = pv;
                break;
            case 2:
                red = pv;
                green = value;
                blue = tv;
                break;
            case 3:         // Blue is the dominant color
                red = pv;
                green = qv;
                blue = value;
                break;
            case 4:
                red = tv;
                green = pv;
                blue = value;
                break;
            case 5:         // Red is the dominant color
                red = value;
                green = pv;
                blue = qv;
                break;
        }

        return target.set(red, green, blue, target.a);
    }
公共静态颜色集颜色(颜色目标、浮动色调、浮动饱和度、浮动值){
饱和=数学钳位(饱和,0.0f,1.0f);
色调%=1f;
如果(色调<0f){
色调++;
}
值=数学钳位(值,0.0f,1.0f);
浮动红=0.0f;
绿色浮动=0.0f;
浮蓝=0.0f;
最终浮点数hf=(色调-(内部)色调)*6.0f;
最终整数ihf=(整数)hf;
最终浮点数f=hf-ihf;
最终浮子pv=值*(1.0f-饱和);
最终浮点数qv=值*(1.0f-饱和*f);
最终浮点tv=值*(1.0f-饱和*(1.0f-f));
开关(ihf){
案例0://红色为主导色
红色=数值;
绿色=电视;
蓝色=pv;
打破
案例1://绿色是主要颜色
红色=qv;
绿色=价值;
蓝色=pv;
打破
案例2:
红色=pv;
绿色=价值;
蓝色=电视;
打破
案例3://蓝色是主要颜色
红色=pv;
绿色=qv;
蓝色=数值;
打破
案例4:
红色=电视;
绿色=pv;
蓝色=数值;
打破
案例5://红色为主导色
红色=数值;
绿色=pv;
蓝色=qv;
打破
}
返回target.set(红色、绿色、蓝色、target.a);
}

这是我一直在使用的版本。所有值都基于0…1范围,因此需要将色调除以255f。它是sam hocevar为glsl提供的此方法的一个端口

public static Color fromHSV(final float hue, final float saturation, final float value) {
    //vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
    final float
        Kx=1f,
        Ky=2f/3f,
        Kz=1f/3f,
        Kw=3f;
    //vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
    final float
        px=Math.abs(fract(hue+Kx)*6f-Kw),
        py=Math.abs(fract(hue+Ky)*6f-Kw),
        pz=Math.abs(fract(hue+Kz)*6f-Kw);
    //return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
    return new Color(
        value*mix(Kx,clamp(px-Kx,0f,1f),saturation),
        value*mix(Kx,clamp(py-Kx,0f,1f),saturation),
        value*mix(Kx,clamp(pz-Kz,0f,1f),saturation),
        1f
    );
}
public static float fract(final float x) {
    return x-(int)x;
}
public static float mix(final float x, final float y, final float a) {
    return x*(1f-a)+y*a;
}
public static float clamp(final float x, final float minVal, final float maxVal) {
    return Math.min(Math.max(x,minVal),maxVal);
}
您还可以使用
颜色重用


@Quadslate,我修改了您的编辑,因为它的负值输出不正确。
public static Color fromHSV(final Color target, final float hue, final float saturation, final float value) {
    //vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
    final float
        Kx=1f,
        Ky=2f/3f,
        Kz=1f/3f,
        Kw=3f;
    //vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
    final float
        px=Math.abs(fract(hue+Kx)*6f-Kw),
        py=Math.abs(fract(hue+Ky)*6f-Kw),
        pz=Math.abs(fract(hue+Kz)*6f-Kw);
    //return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
    return target.set(
        value*mix(Kx,clamp(px-Kx,0f,1f),saturation),
        value*mix(Kx,clamp(py-Kx,0f,1f),saturation),
        value*mix(Kx,clamp(pz-Kz,0f,1f),saturation),
        target.a
    );
}
public static float fract(final float x) {
    return x-(int)x;
}
public static float mix(final float x, final float y, final float a) {
    return x*(1f-a)+y*a;
}
public static float clamp(final float x, final float minVal, final float maxVal) {
    return Math.min(Math.max(x,minVal),maxVal);
}