5

私が2つの色を与えられたとしましょう。

public final static Color FAR = new Color(237, 237, 30);
public final static Color CLOSE = new Color(58, 237, 221);

暗い色に浸ることなく、ある色から次の色に移行するにはどうすればよいですか?

などのアイデアが出てきました。

    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()));

また

    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());

しかし残念ながら、ある色から次の色にスムーズに移行するものはありません。色を明るく保ち、暗い色に浸らないようにする方法、またはグラデーションの移行が最初は遅く、次に速く、次に遅くするのではなく、スムーズにする方法を知っている人はいますか?

私は本当に式を思いつくことができません。

4

3 に答える 3

7

計算で間違った記号を使用しています。比率を適切に適用するには、マイナスではなくプラスにする必要があります。

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()));

既存の実装で暗い色が得られる理由は、(-) を使用すると、0 に近くなることが多いためです (50 未満? または負だが -50 より大きい?)。絶対値なので、小さな正の数、つまり暗い色になります。

于 2013-11-07T16:41:28.670 に答える
1
(ratio * FAR.getGreen()) + ((1 - ratio) * CLOSE.getGreen())

比率が 0 から 1 になる場合、これは加重平均です。比率 = 1/2 とします。比率 = 1/3 の場合、加重平均であり、FAR の加重は 1 で、CLOSE の加重は加重です。 2

于 2013-11-07T16:41:28.167 に答える
1

これは私にとってうまく機能します:

// Steps between fading from one colour to another.
private static final int FadeSteps = 25;

private void fade(Label panel, Color colour) throws InterruptedException {
  final Color oldColour = panel.getBackground();
  final int dRed = colour.getRed() - oldColour.getRed();
  final int dGreen = colour.getGreen() - oldColour.getGreen();
  final int dBlue = colour.getBlue() - oldColour.getBlue();
  // No point if no difference.
  if (dRed != 0 || dGreen != 0 || dBlue != 0) {
    // Do it in n steps.
    for (int i = 0; i <= FadeSteps; i++) {
      final Color c = new Color(
              oldColour.getRed() + ((dRed * i) / FadeSteps),
              oldColour.getGreen() + ((dGreen * i) / FadeSteps),
              oldColour.getBlue() + ((dBlue * i) / FadeSteps));
      panel.setBackground(c);
      Thread.sleep(10);
    }
  }
}

きちんとしたコードではありませんが、機能します。

于 2013-11-07T16:49:29.237 に答える