001 package ui.renderer; 002 003 import util.*; 004 import java.awt.Component; 005 import java.awt.Color; 006 import java.awt.Graphics; 007 import java.util.*; 008 import ui.recognizer.MonochromaticColor; 009 import ui.recognizer.Units; 010 import javax.swing.Icon; 011 012 public class SpectraIcon implements Icon { 013 014 int width = 1024; 015 int height = 10; 016 Star star; 017 018 double min = 3000 * Units.ANGSTROMS; 019 double max = 7000 * Units.ANGSTROMS; 020 021 public SpectraIcon(Star aStar) { 022 star = aStar; 023 } 024 025 public int getIconHeight() { 026 return height; 027 } 028 029 public int getIconWidth() { 030 return width; 031 } 032 033 /** Draw the icon at the specified location. 034 * Icon implementations may use the Component argument to get properties useful for painting, e.g. 035 * the foreground or background color 036 */ 037 public void paintIcon(Component c, Graphics g, int x, int y) { 038 //TODO: Double buffer if flicker becomes noticable 039 040 //Rectangle bounds = c.getBounds(); 041 //int w = bounds.getWidth(); 042 //int h = bounds.getHeight(); 043 044 // Paint spectra background black 045 g.setColor(Color.white); 046 g.fillRect(x, y, width, height); 047 048 List<Line> lines = star.getEmissionLines(); 049 for (Line line : lines) { 050 double wavelength = line.getWavelength() * Units.ANGSTROMS; 051 int xoffset = (int) (((double) width)*(wavelength - min)/(max - min)); 052 if (xoffset < 0 || xoffset >= width) continue; 053 054 if (wavelength < MonochromaticColor.MINIMUM_WAVELENGTH) 055 wavelength = MonochromaticColor.MINIMUM_WAVELENGTH; 056 else if (wavelength > MonochromaticColor.MAXIMUM_WAVELENGTH) 057 wavelength= MonochromaticColor.MAXIMUM_WAVELENGTH; 058 059 // Plot emission line using appropriate color 060 Color color = new MonochromaticColor(wavelength); 061 062 g.setColor(color); 063 g.drawLine(x + xoffset, y, x + xoffset, y + height); 064 } 065 } 066 }