Java平滑颜色过渡

Qui*_*ion 4 java algorithm colors

假设我有两种颜色.

public final static Color FAR = new Color(237, 237, 30);
public final static Color CLOSE = new Color(58, 237, 221);
Run Code Online (Sandbox Code Playgroud)

如何在不浸入深色的情况下从一种颜色过渡到另一种颜色?

我想出了诸如此类的想法

    double ratio = diff / range; // goes from 1 to 0
    int red = (int)Math.abs((ratio * FAR.getRed()) - ((1 - ratio) * CLOSE.getRed()));
    int green = (int)Math.abs((ratio * FAR.getGreen()) - ((1 - ratio) * CLOSE.getGreen()));
    int blue = (int)Math.abs((ratio * FAR.getBlue()) - ((1 - ratio) * CLOSE.getBlue()));
Run Code Online (Sandbox Code Playgroud)

要么

    double ratio = diff / range; // goes from 1 to 0
    int red = (int) ((1 - (diff / range)) * FAR.getRed() + CLOSE.getRed() - FAR.getRed());
    int green = (int) ((1 - (diff / range)) * FAR.getGreen() + CLOSE.getGreen() - FAR.getGreen());
    int blue = (int) ((1 - (diff / range)) * FAR.getBlue() + CLOSE.getBlue() - FAR.getBlue());
Run Code Online (Sandbox Code Playgroud)

但不幸的是,它们都没有顺利地从一种颜色过渡到另一种颜色.有人知道怎么做,同时保持颜色明亮而不是浸入深色,或者如何确保渐变过渡是平滑的而不是先减慢然后快速然后再慢?

我真的没有想出任何配方.

Ale*_*ker 6

你在计算中使用了错误的符号.应该是加号而不是减号来正确应用这个比例.

int red = (int)Math.abs((ratio * FAR.getRed()) + ((1 - ratio) * CLOSE.getRed()));
int green = (int)Math.abs((ratio * FAR.getGreen()) + ((1 - ratio) * CLOSE.getGreen()));
int blue = (int)Math.abs((ratio * FAR.getBlue()) + ((1 - ratio) * CLOSE.getBlue()));
Run Code Online (Sandbox Code Playgroud)

您使用现有实现的颜色变暗的原因是( - ),它们通常会接近于零(小于50?或负数但大于-50?)而在负面情况下,您正在服用绝对值因此它变成一个小的正数,即一个暗色.