2011-09-14 26 views
4

我目前正在嘗試製作一個跟隨鼠標的彩虹線索。我用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

這是否可能使這個更清楚一點?

+0

當我嘗試路徑的顏色取決於它在屏幕上的位置而不是它在後面的路徑中的位置。我需要它,所以它可以從LinkedList中獲取點數並將其顏色基於此..如果這很有意義 –

+0

任何你可以使用[這裏](http://stackoverflow.com/questions/6992633/painting-the-slider-圖標的-JSlider的/ 6996263#6996263)? – trashgod

+0

沒有多少= /我已經嘗試lineargradientpaint,但它不工作,我也需要它。它使一個盒子,而不是遵循指定的點 –

回答

3

要獲得您想要的效果,您可能必須創建一個自定義漸變顏料,該顏料沿着一個軸橫跨hue的色域,沿着另一個軸的透明度範圍爲alpha。作爲一個相關示例,此KineticModel使用RadialGradientPaint來創建一個GradientImage實例的數組。在每個圖像中,α從中心的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是一個不錯的選擇。

+1

我已經詳細闡述了上面 – trashgod

+0

沒有你的代碼,但它讓我想到並幫助我找到答案,所以生病無論如何(反正它實際上是很簡單的,然後你發佈了大聲笑 –

+0

聽起來好像它可以作出很好的回答;如果你發佈它,就可以ping通我,像clut.add(clut.remove())這樣的東西可以有效地提升查找表。 – trashgod