Как бы я сделал цветовой градиент с линейной интерполяцией вместе со связанным списком?
В настоящее время я пытаюсь сделать след радуги, который следует за вашей мышью. Я использовал 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
это может сделать это немного более ясным?
1 ответ
Чтобы получить желаемый эффект, вам, вероятно, придется создать собственную градиентную краску, которая охватывает гамму оттенков вдоль одной оси и диапазон альфа- прозрачности вдоль другой. В качестве связанного примера, это KineticModel
использует RadialGradientPaint
создать массив GradientImage
экземпляров. На каждом изображении альфа изменяется радиально от 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
хороший выбор