gpt4 book ai didi

java - 我将如何使用线性插值和链接列表制作颜色渐变?

转载 作者:搜寻专家 更新时间:2023-11-01 03:12:18 26 4
gpt4 key购买 nike

我目前正在尝试制作一条跟随您的鼠标的彩虹轨迹。我使用 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

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

最佳答案

要获得您想要的效果,您可能必须创建一个跨越hue 色域的自定义渐变绘画。沿一个轴和 alpha 的范围另一方面的透明度。作为一个相关的例子,这个 KineticModel使用 RadialGradientPaint 创建 GradientImage 的数组实例。在每个图像中,alpha 从中心的 0xff (1.0) 到外围的 0x3f (0.25) 径向变化。

附录:基于您的 picture ,只需将图形上下文的 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 是一个不错的选择。

关于java - 我将如何使用线性插值和链接列表制作颜色渐变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7423537/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com