Colors 如何在代码中实现生动的灯光颜色混合?

Colors 如何在代码中实现生动的灯光颜色混合?,colors,color-theory,blending,Colors,Color Theory,Blending,我试图在代码中实现生动的灯光颜色混合(我想现在是c#)。我发现有两页写着怎么做,但我不明白它们的符号 有人知道如何把它转换成代码吗?从我的末端开始,我有两个颜色对象,分别是r、g、b值。除了使用r、g、b值,谁能显示算法 谢谢 以下是我的非工作的实现: using System; using System.Drawing; namespace CardMaker { class VividLight : ColorFilter { public overri

我试图在代码中实现生动的灯光颜色混合(我想现在是c#)。我发现有两页写着怎么做,但我不明白它们的符号

有人知道如何把它转换成代码吗?从我的末端开始,我有两个颜色对象,分别是r、g、b值。除了使用r、g、b值,谁能显示算法

谢谢

以下是我的非工作的实现:

using System;
using System.Drawing;

namespace CardMaker
{
    class VividLight : ColorFilter
    {
        public override Color GetFilteredColor(Color p1, Color p2)
        {
            int newR = Math.Max(0, Math.Min(255, Convert.ToInt32(GetColor(p1.R, p2.R))));
            int newG = Math.Max(0, Math.Min(255, Convert.ToInt32(GetColor(p1.G, p2.G))));
            int newB = Math.Max(0, Math.Min(255, Convert.ToInt32(GetColor(p1.B, p2.B))));

            return Color.FromArgb(newR, newG, newB);
        }

        private static double GetColor(int c1, int c2)
        {
            if (c2 > 128)
            {
                return 256 - ((256 - c1) / (512 * (c2 - 128)));
            }
            else
            {
                return c1 / (256 - 512 * c2);
            }
        }
    }
}

该公式以[0,1]中的浮点数表示,您已将其转换为[0255]。您还相应地缩放了公式中使用的常数

然而,其中一些常数具有相加作用,而另一些常数具有乘法作用。在这两种情况下,你应该做什么是不同的。将要添加的数字可以像您所做的那样进行缩放,但是将要相乘的数字不应该被缩放(结果已经被正确缩放,因为其他被乘数(其中一个颜色值)已经被缩放)。这与在定点算术中实现乘法时所面临的问题有直接的相似性

在这里,无论你说512,你都应该说2

作为旁注,您应该注意整数和浮点除法之间可能存在的速度/精度折衷。您的方法表示返回一个double,但return语句中的表达式的计算结果为int(并使用整数除法,向下舍入)。然后,编译器在求值后将该结果扩大到双精度。如果使用浮点除法,结果可能会更精确(更慢)(为此,请使用常数2.0而不是2)-尽管由于除法后没有任何乘法发生,这可能不会产生很大的差异。两方面都试一下

    private static double GetColor(int c1, int c2)
    {
        if (c2 > 128)
        {
            return 256 - ((256 - c1) / (2 * (c2 - 128)));
        }
        else
        {
            return c1 / (256 - 2 * c2);
        }
    }