_HSB32

From QB64 Phoenix Edition Wiki
Revision as of 17:28, 3 December 2024 by RhoSigma (talk | contribs)
Jump to navigation Jump to search

The _HSB32 function specifies a color using the HSB colorspace and returns the 32-bit ARGB color value representing the color with the specified hue, saturation and brightness.


Syntax

color32value~& = _HSB32(hue#, saturation#, brightness#)


Parameters

  • hue# specifies the hue DOUBLE of the desired color from 0 to 360 degrees.
    • The color wheel starts with red(0), turns to yellow(60), green(120), cyan(180), blue(240), magenta(300) to red(360) again.
    • Mixed colors can be build by specifying values between the 6 base color angles.
  • saturation# specifies the saturation DOUBLE of the desired color from 0 to 100 percent.
    • 100% is the richest color possible, as closer you come to 0%, as more the color is fading ending at dull gray.
    • The intensity of the gray (i.e. black >> darkgray >> midgray >> lightgray >> white) depends on the brightness# value.
  • brightness# specifies the brightness DOUBLE of the desired color from 0 to 100 percent.
    • 100% is the brightest (highest intensity), as closer you come to 0%, as darker is the color always ending in black regardless of the given hue# and saturation#.


Description

  • The value returned is always a 32-bit _UNSIGNED LONG ARGB color value, as is the POINT value.
  • Return variable types must be _UNSIGNED LONG or LONG, otherwise the resulting color may lose the _BLUE value.
  • Parameter values outside the allowed ranges are clipped.
  • All colors build with this function are opaque (full alpha), i.e. it returns _UNSIGNED LONG 32-bit hexadecimal values from &HFF000000 to &HFFFFFFFF.
  • Use _HSBA32 if you also need control over the alpha channel.
  • When (_UNSIGNED) LONG values are PUT to file, the ARGB values become BGRA. Use LEFT$(MKL$(color32value~&), 3) to place 3 colors.
Naming differences
The HSB (B=Brightness) colorspace is also known as HSV (V=Value) and sometimes even called HSI (I=Intensity), but that's all just different names for the same thing.
However, this function is not suitable for the HSL (L=Lightness) colorspace, which is widely used in the Web/CSS.
Precision drawbacks
When converting between colorspaces, rounding errors can occur. While the HSB colorspace has virtually infinite precision only limited by the used floating point type, RGB is represented in 8-bit integers (0-255) only, which can lead to quantization errors. In fact, not all colors in HSB can be accurately represented in RGB and vice versa.
However, if you limit yourself to only passing integer values to _HSB32 or _HSBA32, just as you do for the respective RGB colorspace functions _RGB32 or _RGBA32, then you can get back that exact values by CINTing the results returned by _HUE32, _SATURATION32 and _BRIGHTNESS32.


Availability


Examples

Example 1
Drawing a color wheel by looping through hue and saturation.
SCREEN _NEWIMAGE(640, 480, 32)

FOR ang# = 0 TO 360 STEP 0.25
    FOR rad# = 0 TO 200 STEP 0.25
        x% = rad# * COS(_D2R(ang#))
        y% = rad# * SIN(_D2R(ang#))
        PSET (320 + x%, 240 - y%), _HSB32(ang#, rad# / 2, 100)
    NEXT rad#
NEXT ang#

END

Example 2
Drawing a 3D model of the HSB colorspace with a cut to see inside.
SCREEN _NEWIMAGE(640, 480, 32)

FOR hei# = 0 TO 200 STEP 5
    FOR ang# = 5 TO 285 STEP 0.25
        FOR rad# = 0 TO 200 STEP 1
            x% = rad# * COS(_D2R(ang#))
            y% = rad# * SIN(_D2R(ang#))
            z% = hei#
            XYfrom3D x%, y%, z%
            PSET (330 + x%, -z% + 340), _HSB32(ang#, rad# / 2, hei# / 2)
            IF rad# = 0 _ANDALSO (hei# = 0 OR hei# = 200) THEN
                IF hei# = 0 THEN
                    IF ang# = 5 THEN bmpx% = 330 + x%: bmpy% = -z% + 340
                ELSE
                    IF ang# = 5 THEN tmpx% = 330 + x%: tmpy% = -z% + 340
                END IF
            ELSEIF rad# = 200 _ANDALSO (hei# = 0 OR hei# = 200) THEN
                PSET (330 + x%, -z% + 340), &HFFFFFFFF
                IF hei# = 0 THEN
                    IF ang# = 5 THEN bspx% = 330 + x%: bspy% = -z% + 340
                    IF ang# = 285 THEN bepx% = 330 + x%: bepy% = -z% + 340
                ELSE
                    IF ang# = 5 THEN tspx% = 330 + x%: tspy% = -z% + 340
                    IF ang# = 285 THEN tepx% = 330 + x%: tepy% = -z% + 340
                END IF
            END IF
        NEXT rad#
    NEXT ang#
NEXT hei#
LINE (bspx%, bspy%)-(bmpx%, bmpy%), &HFFFFFFFF
LINE (bmpx%, bmpy%)-(bepx%, bepy%), &HFFFFFFFF
LINE (tspx%, tspy%)-(tmpx%, tmpy%), &HFFFFFFFF
LINE (tmpx%, tmpy%)-(tepx%, tepy%), &HFFFFFFFF
LINE (bspx%, bspy%)-(tspx%, tspy%), &HFFFFFFFF
LINE (bmpx%, bmpy%)-(tmpx%, tmpy%), &HFFFFFFFF
LINE (bepx%, bepy%)-(tepx%, tepy%), &HFFFFFFFF
END

SUB XYfrom3D (x%, y%, z%)
x% = (x% + (y% * .5))
z% = (z% + (y% * .5))
END SUB


See also



Navigation:
Main Page with Articles and Tutorials
Keyword Reference - Alphabetical
Keyword Reference - By usage
Report a broken link