Как бы я сделал цветовой градиент с линейной интерполяцией вместе со связанным списком? - PullRequest
4 голосов
/ 15 сентября 2011

В настоящее время я пытаюсь создать след радуги, который следует за вашей мышью. я использовал 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 Ответ

3 голосов
/ 15 сентября 2011

Чтобы получить желаемый эффект, вам, вероятно, придется создать собственную градиентную краску, которая охватывает гамму оттенок вдоль одной оси и диапазон прозрачности alpha вдоль другой. В качестве связанного примера этот 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 - хороший выбор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...