如何使用线性插值和链接列表创建颜色渐变?

我正在尝试制作跟随鼠标的彩虹路径。 我使用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 trail = new LinkedList(); 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) trail).get(i); XY next = ((LinkedList) 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

这可能会使这一点更清楚吗?

为了获得您想要的效果,您可能需要创建一个自定义渐变涂料,该涂料跨越一个轴的色调范围和沿另一个轴的Alpha透明度范围。 作为相关示例,此KineticModel使用KineticModel创建GradientImage实例的数组。 在每个图像中,α从中心的0xff (1.0)到外围的0x3f (0.25)径向变化。

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

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

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