Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 颜色选择器算法_C++ - Fatal编程技术网

C++ 颜色选择器算法

C++ 颜色选择器算法,c++,C++,我希望了解如下颜色选择器背后的基本算法: 我想从头开始实现类似的功能,但首先要了解基本算法。我相信这是为了遵循色调-饱和度-亮度模型(或者类似色调-饱和度-亮度模型的东西) 对于HSB,通常最容易将颜色视为圆柱体。色调表示围绕圆的旋转。饱和度是沿圆柱体轴线的位置,亮度是从中心到外部的距离 这样看,右边的带子代表色调,所以当我们移动它时,我们选择围绕圆柱体旋转 左边的正方形是圆柱体从中心到外部的一部分。该正方形的Y轴表示亮度/亮度。在亮度为0(底部)时,无论其他任何情况,我们都会得到黑色 正方

我希望了解如下颜色选择器背后的基本算法:


我想从头开始实现类似的功能,但首先要了解基本算法。

我相信这是为了遵循色调-饱和度-亮度模型(或者类似色调-饱和度-亮度模型的东西)

对于HSB,通常最容易将颜色视为圆柱体。色调表示围绕圆的旋转。饱和度是沿圆柱体轴线的位置,亮度是从中心到外部的距离

这样看,右边的带子代表色调,所以当我们移动它时,我们选择围绕圆柱体旋转

左边的正方形是圆柱体从中心到外部的一部分。该正方形的Y轴表示亮度/亮度。在亮度为0(底部)时,无论其他任何情况,我们都会得到黑色

正方形的X轴表示饱和度。在最左边是0饱和度,所以在最边缘,我们有一个纯灰色带,从底部的纯黑色到顶部的纯白色。向右移动,饱和度增加,直到我们到达右侧,这里有纯(在本例中)红色,从底部的最小亮度到顶部的最大亮度不等

请注意,这些(基本上都是圆柱形的颜色模型)在如何表示颜色方面有一些…奇怪之处。例如,在“灯光/亮度”为0时,其他两个输入(色调和饱和度)将变得毫无意义,因为不管它们是什么,都会得到纯黑色。同样,在最大亮度/亮度时,无论其他两个值如何,都会得到纯白色

如果你打算从头开始编码,我会亲自尝试实现一个双圆锥模型。与圆柱体不同,这将颜色视为双圆锥体,两端的半径为0,中间的最大半径为。在最小或最大亮度下,半径为0,准确反映了纯黑色或纯白色没有颜色成分的事实。大约在这两个极端之间,我们有可能达到最大饱和

与双音模型的主要区别在于,在左边,我们将得到一个三角形,而不是一个正方形。与正方形非常相似,左侧会有纯灰色,从底部的纯黑色到顶部的纯白色。在右边,我们会有不同程度的饱和度在亮度,最大饱和度正好介于两者之间。在亮度越来越低的情况下,饱和度会越来越低,直到达到极限,饱和度总是为零

底部的亮度为零,因此您只能选择黑色。同样,在最上面,您可以选择的唯一颜色是白色。介于两者之间,您可以选择所选角度的最饱和颜色(在本例中为纯红色)。当您接近顶部/底部时,您可以获得更高/更低的亮度,并且可用的最大饱和度会降低

就像圆柱形模型一样,您也需要一些方法来选择色调。就我个人而言,我会把它放在左边而不是右边,但也许那只是我。我还将它画成一个圆圈,显示混合在一起的颜色,并有一条线,用户可以将其拉到圆圈上选定的角度。至少在我看来,这不会那么令人困惑。缺点是圆形明显比矩形占用更多的屏幕空间(但让我们面对现实:640x480显示器不再常见,所以这不是什么大问题)


了解色彩理论,特别是色彩空间。这看起来像是在HSV颜色空间中,垂直滑块是色调,矩形轴对应饱和度和值分量。非常全面,肯定为我指明了正确的方向。在双圆锥模型下,这个颜色选择器在外观上有什么不同?