当前位置: 首页 > 面试题库 >

如何使用线性插值和“链接的列表”制作颜色渐变?

陈胤
2023-03-14
问题内容

我目前正在尝试沿着鼠标移动彩虹轨迹。我使用Linkedlist绘制了鼠标的点,因此轨迹也随之而来。路径本身看起来很完美,只有路径中看起来不正确的颜色。我希望他们彼此淡入淡出。有人告诉我要使用线性插值,并且在研究了一段时间之后,似乎可以正常使用,只是我不知道如何实现它。

这是我到目前为止的代码:

import impsoft.bots.ColorBot;
import impsoft.scripting.ibot.interfaces.AutoPaint;
import impsoft.scripting.types.ColorScript;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.util.Deque;
import java.util.LinkedList;

import impsoft.scripting.ibot.structs.XY;
import impsoft.scripting.types.ColorSkeltonScriptable;
import impsoft.scripting.types.parallel.scriptjobs.ScriptJob;


public class MouseTrail extends ColorScript implements AutoPaint {
     public MouseTrail(ColorBot c) {
      super(c);

     }
    public void script() throws InterruptedException {
     while(true) {
         mt.setSize(500);
         mt.exec();

      sleep(100);
     }
    }

    public static String name = "Mouse trail test";
    public static String author = "Llaver";
    public static String description = "test for mouse trail";
    public static double version = 1.00;


public class MouseTrail2 extends ScriptJob implements AutoPaint {


    private int size;
    private final ColorSkeltonScriptable cs;
    private final Deque<XY> trail = new LinkedList<XY>();
    private final Color[] rainbow = new Color[]{
            Color.RED, Color.YELLOW, Color.GREEN, Color.CYAN, Color.BLUE, Color.magenta
        };

    public MouseTrail2(ColorSkeltonScriptable cs) {
        super(cs);
        this.cs = cs;
    }

    public void setSize(int s) {
        size = s;
        s = 200;
    }

    public void runV() {
        try {
            while (true) {

                synchronized (trail) {
                    if (trail.size() >= size) {
                        trail.pop();
                    }
                    trail.offer(cs.getCurrentMouseXY());
                }
                sleep(1);
            }

        } catch (InterruptedException e) {
        }
    }

    @Override
    public void paint(Graphics g) {
        final Graphics2D g2d = (Graphics2D) g;
        g2d.setStroke(new BasicStroke(3, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND));
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        synchronized (trail) {
                float perc;
                int idx;
                for(int i = 1 ; i < trail.size() - 1 ; i++){
        XY current = ((LinkedList<XY>) trail).get(i);
        XY next = ((LinkedList<XY>) trail).get(i - 1);
        perc = ((float)i / trail.size()) * 100f;
       idx = Math.round((perc * (float)rainbow.length) / 100f);
       if(idx >= rainbow.length)idx -= 1;       
       g2d.setColor(rainbow[idx]);
        g.drawLine(current.x, current.y, next.x, next.y);
    }
            }
        }

    }


@Override
public void paint(Graphics arg0) {  
}
private MouseTrail2 mt = new MouseTrail2(this);

}

一些照片:

这就是我现在所拥有的:

http://img11.imageshack.us/img11/3031/mousetrailhavenow.png

这就是我想要得到的:

http://img594.imageshack.us/img594/7381/mousetrailtryingtoget.png

这是否可能使这一点更清楚?


问题答案:

为了得到你想要的效果,你可能将不得不创建一个自定义渐变画跨越的色域色调沿一轴的范围阿尔法沿其他透明度。作为一个相关示例,它KineticModel使用RadialGradientPaint来创建GradientImage实例数组。在每个图像中,alpha值从0xff中心的(1.0)到0x3f外围的(0.25)径向变化。

附录:根据您的图片,只需将图形上下文设置Stroke为合适的宽度,将绘画设置为颜色查询表(clut)中的下一个色调,然后按drawLine()。您可以改变色调,保持饱和度和亮度恒定。

float N = 360;
Queue<Color> clut = new LinkedList<Color>();
for (int i = 0; i < N; i++) {
    clut.add(Color.getHSBColor(i / N, 1, 1));
}

您必须根据时间或空间来决定何时更改颜色。对于后者,javax.swing.Timer是一个不错的选择。



 类似资料:
  • 我试图找出如何复制JavaFX梯度是如何在涉及透明度时插值/混合的。如果我尝试使用内置的方法在颜色之间插值的简单方法,我会得到完全不同的结果。正如您在这里看到的: 这两个渐变都是简单的[红色@0%,rgba(0,0,255,0)@50%,绿色@100%],但是蓝色在JavaFX渐变(顶部)中根本不可见,在朴素的方法(底部)中非常可见。颜色如何在渐变中插值的实际公式是什么,在哪里可以找到它(即什么类

  • 我想知道我们如何创建从图像中提取颜色的渐变叠加。 就像雷索主场球员一样。

  • 问题内容: 我正在尝试在Swift中使用十六进制颜色值,而不是允许您使用的几个标准颜色值,但是我不知道该怎么做。 示例:如何将其用作颜色? 问题答案: 实际上是用十六进制表示的3种颜色分量- 红色,绿色和蓝色。您可以使用前缀在Swift中编写十六进制表示法,例如 为了简化转换,让我们创建一个采用整数(0-255)值的初始化程序: 用法: 如何获得阿尔法? 根据您的用例,您可以简单地使用本机方法,例

  • 我正在处理网络数据,希望使用r中networkd3包中的将其可视化。在我的数据帧中,我有一个源节点和一个目标节点、值以及一个分组列组。 < li >如何在不对节点着色的情况下绘制sankey图(源和目标都不着色)? < li >我想通过变量组< code>LinkGroup = "group"给链接线着色,并且我想知道如何制作图例来显示链接的不同颜色实际上代表了组变量。 这是代码和数据框...

  • 前面课程讲解过一系列顶点通过顶点着色器逐顶点处理后,再经过图元装配、光栅化环节会得到原始未定义颜色的片元,然后经过片元着色器逐片元添加颜色,会得到一副图像。在片元着色器程序中编写代码 gl_FragColor = vec4(1.0,0.0,0.0,1.0)就表示所有经过光栅化生成的没定义颜色的片元经过片元着色器处理后所有片元赋值红色得到一个个红色像素值。 如果希望不同的片元定义不同的颜色怎么编写代

  • 问题内容: 我想将低于颜色的线性渐变添加到Material-UI Chip作为背景色。可能吗? 我正在使用Material-UI v0.18.7。 问题答案: 只需将设置为所需的样式即可: 请注意,这是一个返回图像而不是颜色的CSS函数。因此,您必须设置属性(使用图像)而不是属性(仅使用颜色)。这是来自Mozilla文档的引文,对此进行了更为详尽的解释: 由于s属于数据类型,因此只能在可以使用s的