Graphics 如何计算四色渐变?

Graphics 如何计算四色渐变?,graphics,drawing,colors,gradient,Graphics,Drawing,Colors,Gradient,如果我在一个正方形的四个角上有四种颜色(A,B,C和D),我想用一个渐变填充这个正方形,这四种颜色很好地混合在一起,我该如何计算点E的颜色 E与任何其他点的距离越近,颜色对结果的影响就越强 你知道怎么做吗?速度和简单性优于准确性 确定点E到每个点A、B、C、D的距离 点E的颜色将是红色/绿色/蓝色的组合。计算每个颜色轴作为A、B、C、D的相同颜色轴的平均值,按距离思考 距离a=sqrt((xa-xe)^2+(ya-ye)^2) 距离_b= 距离之和=距离a+距离b 红色=(红色距离a+红色距离

如果我在一个正方形的四个角上有四种颜色(A,B,C和D),我想用一个渐变填充这个正方形,这四种颜色很好地混合在一起,我该如何计算点E的颜色

E与任何其他点的距离越近,颜色对结果的影响就越强

你知道怎么做吗?速度和简单性优于准确性

  • 确定点E到每个点A、B、C、D的距离
  • 点E的颜色将是红色/绿色/蓝色的组合。计算每个颜色轴作为A、B、C、D的相同颜色轴的平均值,按距离思考

    距离a=sqrt((xa-xe)^2+(ya-ye)^2)

    距离_b=

    距离之和=距离a+距离b

    红色=(红色距离a+红色距离b…)/总距离

    color_E=ColorFromARgb(红色、绿色、蓝色)


  • 当两种颜色之间需要渐变时,最好的解决方案是使用表示(色调饱和度值)

    如果有两种颜色的HSV值,只需对H、S和V进行线性插值,就可以得到好的颜色(RGB空间中的插值总是导致“坏”结果)

    您还可以分别找到从RGB到HSV和从HSV到RGB的公式

    现在,对于四个角点的问题,可以对四个H/S/V值进行线性组合,通过从E到四个点a、B、C和D的距离进行加权

    编辑:与tekBlues相同的方法,但在HSV空间中(在RGB和HSV空间中测试它非常容易。你会看到不同之处。在HSV中,你只需旋转彩色圆柱体,这就是为什么它会给出很好的结果)

    编辑2:如果你喜欢“速度和简单”,你可以使用L1范数,而不是L2范数(欧几里德范数)

    因此,如果
    a
    是正方形的大小,点的坐标是a(
    0
    0
    ),B(
    0
    a
    ),C(
    a
    0
    ),D(
    a
    a
    ),那么点E的色调(
    x
    y
    )可以用以下公式计算:

    Hue(E) = ( Hue(B)*y/a + Hue(A)*(1-y/a) ) * (x/a)  +  ( Hue(D)*y/a + Hue(C)*(1-y/a) ) * (1-x/a)
    
    其中,
    色调(A)
    是点A的色调,
    色调(B)
    是点B的色调,等等

    对饱和度和值应用相同的公式


    一旦你有了E点的色调/饱和度/值,你就可以在RGB空间中对其进行变换。

    查看此网站,该网站提供了@ThibThib关于“HSV中的渐变将更令人满意”的评论的视觉演示:

    它是一个渐变创建者,将创建并显示RGB渐变和HSV渐变

    如果你尝试从FFAAA到AAFFAA(浅红色到绿色)的9个步骤,你会在浅黄色中得到一个很好的过渡,HSV和RGB看起来很相似


    但是尝试从FF0000到00FF00(粗体红到绿色)的9个步骤,您将看到RGB one通过令人恶心的绿棕色过渡。然而,HSV渐变通过粗体黄色过渡。

    我成功了,非常感谢。看起来也不错!上述组合方法也称为“双线性插值”。你们分别对H、S和V值进行测试。我担心这种方法有问题。“A”对“E”颜色贡献的“权重”应与距离的倒数成正比。如上所述,如果E正好在A处,那么到A的距离为0,因此A对E的值没有贡献。但在这种情况下,只有A对E有贡献。