将色圈分成几个部分

时间:2011-09-01 09:31:02

标签: c# math

如何以编程方式将色环分成几个部分,以及如何在此部分中获取所有RGB颜色?

Color Circle

我想通过RGB颜色的输入参数返回颜色部分的fce。

int getColorSection(RGB color);

2 个答案:

答案 0 :(得分:2)

使用HSL色彩空间。 H是色调,色环上的颜色角度。您可以直接从System.Drawing.Color.GetHue()方法获取它。

答案 1 :(得分:2)

我不知道我是否正确理解了这个问题,但我想你问的颜色是更绿,更蓝或蓝红? 这将为您提供有关哪个部分(红色,绿色或蓝色)的信息。

为此,在不考虑人类对颜色的感知的情况下,您可以这样做:

public enum ColorSection
{
    Red,
    Green,
    Blue
}

public ColorSection GetColorSection(int rgb)
{
    int r = rgb & 0xFF;
    int g = (rgb >> 8) & 0xFF;
    int b = (rgb >> 16) & 0xFF;

    return (r > g && r > b) ? ColorSection.Red : ((g > b) ? ColorSection.Green : ColorSection.Blue);
}

当然,如果你的颜色有两个相等的值,那么效果不会很好,如果你有红色=绿色,它会返回红色。 如果你有白色它会返回红色,如果你有黑色,它会返回蓝色。

如果您需要更多花哨的东西,可能就像您要求的那样,那么您需要使用最近邻近似和极坐标。

您可以使用Hue计算角度,如指出的那样。 从角度来看,您只需将其转换为整数即可。

计算色调:

    public static double GetHue(int rgb)
    {
        double result = 0.0;
        int r = rgb & 0xFF;
        int g = (rgb >> 8) & 0xFF;
        int b = (rgb >> 16) & 0xFF;

        if (r != g && g != b)
        {
            double red = r / 255.0;
            double green = g / 255.0;
            double blue = b / 255.0;

            double max = Math.Max(Math.Max(red, green), blue);
            double min = Math.Min(Math.Min(red, green), blue);

            double delta = max - min;
            if (delta != 0)
            {
                if (red == max)
                    result = (green - blue) / delta;
                else if (green == max)
                    result = 2 + ((blue - red) / delta);
                else if (blue == max)
                    result = 4 + ((red - green) / delta);

                result *= 60.0;
                if (result < 0)
                    result += 360.0;
            }
        }

        return result;
    }

它返回角度,以度为单位,从0到360,您在色轮中的位置。 您可以使用neirest neighbor计算部分。

例如:

const int NumberOfSections = 10;
int section = (int)(GetHue() * NumberOfSections / 360.0);

然而,您的车轮似乎相对于C#色轮旋转。 您可能需要减去一个确切差异的恒定角度。

如果我没错,差异是180°。

    public static double GetMyHue(int rgb)
    {
        return (GetHue(rgb) + 180.0) % 360.0;
    }