1 package baseCode.gui;
2
3 import java.awt.Color;
4
5 /***
6 * <p>
7 * Title: ColorMap
8 * </p>
9 * <p>
10 * Description: contains predefined color maps for visualization and color palette methods
11 * </p>
12 * <p>
13 * Copyright (c) 2004
14 * </p>
15 * <p>
16 * Institution:: Columbia University
17 * </p>
18 *
19 * @author Will Braynen
20 * @version $Id: ColorMap.java,v 1.7 2004/07/27 03:18:58 pavlidis Exp $
21 */
22
23 public class ColorMap {
24
25 /*** first color in the current color map */
26 protected Color m_minColor;
27 /*** last color in the current color map */
28 protected Color m_maxColor;
29 protected Color[] m_customColorMap;
30
31 public static final int m_defaultSuggestedNumberOfColors = 64;
32 public static final Color DARK_RED = new Color( 128, 0, 0 );
33 public static final Color[] GREENRED_COLORMAP = {
34 Color.green, Color.black, Color.red
35 };
36 public static final Color[] REDGREEN_COLORMAP = {
37 Color.red, Color.black, Color.green
38 };
39 public static final Color[] BLACKBODY_COLORMAP = {
40 Color.black, DARK_RED, Color.orange, Color.yellow, Color.white
41 };
42
43 protected Color[] m_currentColorMap = GREENRED_COLORMAP;
44
45 protected Color[] m_colorPalette;
46
47 public ColorMap() {
48
49 this( m_defaultSuggestedNumberOfColors );
50 }
51
52 public ColorMap( int suggestedNumberOfColors ) {
53
54 this( suggestedNumberOfColors, GREENRED_COLORMAP );
55 }
56
57 public ColorMap( Color[] colorMap ) {
58
59 this( m_defaultSuggestedNumberOfColors, colorMap );
60 }
61
62 /***
63 * Pre-condition: suggestedNumberOfColors > colorMap.length
64 *
65 * @param suggestedNumberOfColors int
66 * @param colorMap Color[]
67 */
68 public ColorMap( int suggestedNumberOfColors, Color[] colorMap ) {
69
70 m_currentColorMap = colorMap;
71 m_colorPalette = createColorPalette( suggestedNumberOfColors, colorMap );
72 }
73
74 /***
75 * Calculate how fast we have to change color components. Assume min and max colors are different!
76 *
77 * @param minColor red, green, or blue component of the RGB color
78 * @param maxColor red, green, or blue component of the RGB color
79 * @param totalColors int
80 * @return positive or negative step size
81 */
82 protected int getStepSize( int minColor, int maxColor, int totalColors ) {
83
84 int colorRange = maxColor - minColor;
85 double stepSize = colorRange / ( 1 == totalColors ? 1 : totalColors - 1 );
86 return ( int ) Math.round( stepSize );
87 }
88
89 /***
90 * Allocates colors across a range.
91 *
92 * @param suggestedNumberOfColors palette resolution; if colorPalette.length does not evenly divide into this number,
93 * the actual number of colors in the palette will be rounded down.
94 * @param colorMap the simplest color map is { minColor, maxColor }; you might, however, want to go through
95 * intermediate colors instead of following a straight-line route through the color space.
96 * @return Color[] the color palette
97 */
98 protected Color[] createColorPalette( int suggestedNumberOfColors,
99 Color[] colorMap ) {
100
101 Color[] colorPalette;
102 Color minColor;
103 Color maxColor;
104
105
106
107
108
109 int totalSegments = m_currentColorMap.length - 1;
110
111
112
113 int colorsPerSegment = suggestedNumberOfColors / totalSegments;
114
115
116
117 int totalColors = totalSegments * colorsPerSegment;
118
119
120 colorPalette = new Color[totalColors];
121
122 for ( int segment = 0; segment < totalSegments; segment++ ) {
123
124
125 minColor = colorMap[segment];
126 int r = minColor.getRed();
127 int g = minColor.getGreen();
128 int b = minColor.getBlue();
129
130
131 maxColor = colorMap[segment + 1];
132 int redStepSize = getStepSize( r, maxColor.getRed(), colorsPerSegment );
133 int greenStepSize = getStepSize( g, maxColor.getGreen(),
134 colorsPerSegment );
135 int blueStepSize = getStepSize( b, maxColor.getBlue(),
136 colorsPerSegment );
137
138 for ( int k, i = 0; i < colorsPerSegment; i++ ) {
139
140 r = Math.min( r, 255 );
141 g = Math.min( g, 255 );
142 b = Math.min( b, 255 );
143
144
145 r = Math.max( r, 0 );
146 g = Math.max( g, 0 );
147 b = Math.max( b, 0 );
148
149 k = segment * colorsPerSegment + i;
150 colorPalette[k] = new Color( r, g, b );
151
152 r += redStepSize;
153 g += greenStepSize;
154 b += blueStepSize;
155 }
156 }
157
158 return colorPalette;
159
160 }
161
162 public Color getColor( int i ) {
163
164 return m_colorPalette[i];
165 }
166
167 public Color[] getPalette() {
168
169 return m_colorPalette;
170 }
171
172 /***
173 * @return the number of colors in the palette
174 */
175 public int getPaletteSize() {
176
177 return m_colorPalette.length;
178 }
179 }