/* * Open Source Physics software is free software as described near the bottom of this code file. * * For additional information and documentation on Open Source Physics please see: * <http://www.opensourcephysics.org/> */ package org.opensourcephysics.display; import java.awt.Color; /** * Defines color palette used by OSP components. * * @author Wolfgang Christian * @version 1.0 */ public class DisplayColors { static Color[] phaseColors = null; //static Color[] lineColors = {Color.red, Color.green, Color.blue, Color.yellow.darker(), Color.cyan, Color.magenta}; //static Color[] markerColors = {Color.black, Color.blue, Color.red, Color.green, Color.darkGray, Color.lightGray}; static java.util.Dictionary<Integer, Color> lineColors = new java.util.Hashtable<Integer, Color>(); static java.util.Dictionary<Integer, Color> markerColors = new java.util.Hashtable<Integer, Color>(); // static{ // lineColors.put(0, Color.RED); // lineColors.put(1, Color.GREEN); // lineColors.put(2, Color.BLUE); // lineColors.put(3, Color.YELLOW.darker()); // lineColors.put(4, Color.CYAN.darker()); // lineColors.put(5, Color.MAGENTA.darker()); // // markerColors.put(0, Color.RED.brighter().brighter()); // markerColors.put(1, Color.GREEN.brighter().brighter()); // markerColors.put(2, Color.BLUE.brighter().brighter()); // markerColors.put(3, Color.YELLOW.brighter()); // markerColors.put(4, Color.CYAN.brighter()); // markerColors.put(5, Color.MAGENTA.brighter()); // } static { lineColors.put(0, Color.RED); lineColors.put(1, Color.GREEN.darker()); lineColors.put(2, Color.BLUE); lineColors.put(3, Color.YELLOW.darker()); lineColors.put(4, Color.CYAN.darker()); lineColors.put(5, Color.MAGENTA); markerColors.put(0, Color.RED); markerColors.put(1, Color.GREEN.darker()); markerColors.put(2, Color.BLUE); markerColors.put(3, Color.YELLOW.darker()); markerColors.put(4, Color.CYAN.darker()); markerColors.put(5, Color.MAGENTA); } private DisplayColors() {} /** * Gets an array of colors. * * @return the color array */ public static Color[] getPhaseToColorArray() { if(phaseColors==null) { phaseColors = new Color[256]; for(int i = 0; i<256; i++) { double val = Math.abs(Math.sin(Math.PI*i/255)); int b = (int) (255*val*val); val = Math.abs(Math.sin(Math.PI*i/255+Math.PI/3)); int g = (int) (255*val*val*Math.sqrt(val)); val = Math.abs(Math.sin(Math.PI*i/255+2*Math.PI/3)); int r = (int) (255*val*val); phaseColors[i] = new Color(r, g, b); } } return phaseColors; } /** * Converts a phase angle in the range [-Pi,Pi] to a color. * * @param phi phase angle * @return the color */ public static Color phaseToColor(double phi) { int index = (int) (127.5*(1+phi/Math.PI)); index = index%255; if(phaseColors==null) { return getPhaseToColorArray()[index]; } return phaseColors[index]; } /** * Gets a random color. * * @return random color */ public static Color randomColor() { return new Color((int) (Math.random()*255), (int) (Math.random()*255), (int) (Math.random()*255)); } /** * Gets a line color that matches the index. * @param index int * @return Color */ static public Color getLineColor(int index) { Color color = lineColors.get(index); if(color==null) { // create and store a new color float h = ((float) (index*Math.PI/12))%1; // each increment moves slightly more than 1/4 turn around color wheel float s = 1.0f; // maximum saturation for vibrant colors float b = 0.5f; // lines are often thin and should be darker for visibility on light backgrounds color = Color.getHSBColor(h, s, b); lineColors.put(index, color); } return color; } /** * Gets a marker color that matches the index. * @param index int * @return Color */ static public Color getMarkerColor(int index) { Color color = markerColors.get(index); if(color==null) { // create and store a new color color = getLineColor(index).brighter().brighter(); markerColors.put(index, color); } return color; } } /* * Open Source Physics software is free software; you can redistribute * it and/or modify it under the terms of the GNU General Public License (GPL) as * published by the Free Software Foundation; either version 2 of the License, * or(at your option) any later version. * Code that uses any portion of the code in the org.opensourcephysics package * or any subpackage (subdirectory) of this package must must also be be released * under the GNU GPL license. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston MA 02111-1307 USA * or view the license online at http://www.gnu.org/copyleft/gpl.html * * Copyright (c) 2007 The Open Source Physics project * http://www.opensourcephysics.org */