【问题标题】:Get a gradient given a color where the color is in the middle of the gradient获取给定颜色的渐变,其中颜色位于渐变中间
【发布时间】:2013-08-28 23:23:48
【问题描述】:

假设我有一个随机的 RGB 值,例如 240 23 123。好吗? 所以我想在 HSV 中转换 RGB 值,我需要 RGB 颜色正好在渐变的中间。所以渐变的所有其他值应该有更多的饱和度或更少。 理想情况下,渐变应该总是倾向于白色,而与初始 RGB 值无关。 有没有公​​式或算法来实现这一点? 结果应该是 1 个梯度的 HSV 值数组。

【问题讨论】:

  • 大多数语言已经有可用的色彩空间映射算法,有时在它们的标准库中。我建议使用那个/那些。
  • 色彩空间映射。不知道你在说什么。对我来说这是一个新词,色彩空间映射。我正在使用 2D 游戏引擎。我的问题基本上是随机 RGB 值具有不同的 S,它可能在 0 到 100 之间变化,而 90 的 S 并不完全位于范围的中间,因此我可以获得不超过 20 个值的结果数组呈白色,但有时呈灰色。
  • 理想情况下,a 也应该涉及 V,但我不知道如何用 S 插入它。

标签: algorithm math graphics colors hsv


【解决方案1】:

如果您希望渐变从白色开始,转到您的颜色,然后转到黑色,您可以通过多种方式实现。这是一种方法:

const int numEntries = 20;
const int halfNumEntries = numEntries / 2;
RGBColor gradient[numEntries];
HSVColor hsv = RGBToHSV (rgb); // Where rgb is the RGB color you start with

// Gradient from white to your color
for (int i = 0; i < halfNumEntries; i++)
{
    float newHue = hsv.hue;
    float newSat = (i / halfNumEntries) * hsv.sat;
    float newVal = 1.0 + (i / halfNumEntries) * (hsv.val - 1.0);
    gradient [ i ] = HSVToRGB (newHue, newSat, newVal);
}

gradient [ halfNumEntries ] = rgb;

// Gradient from your color to black
for (int i = (halfNumEntries + 1); i < numEntries; i++)
{
    float newHue = hsv.hue;
    float newSat = hsv.sat + ((i - halfNumEntries) / (halfNumEntries - 1)) * (0.0 - hsv.sat);
    float newVal = hsv.val + ((i - halfNumEntries) / (halfNumEntries - 1)) * (0.0 - hsv.val);
    gradient [ i ] = HSVToRGB (newHue, newSat, newVal);
}

【讨论】:

  • i/10.0 代表什么?什么是 10.0 。如果我想增加每个渐变的颜色数量?
  • 10 是条目数的一半。 i/10 是您在渐变的前半部分(或后半部分)的距离。我已经更新了代码,使其更加清晰。
猜你喜欢
  • 2011-03-19
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-26
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多