/******************************************************************************* * Copyright 2014 Geoscience Australia * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package au.gov.ga.earthsci.worldwind.common.layers.stars; import java.awt.Color; /** * Helper class that maps star B-V magnitude and star type/class to an RGB * color. * * @author Michael de Hoog (michael.dehoog@ga.gov.au) */ public class StarColor { /** * Convert a star's B-V magnitude to RGB. * <p/> * Used function from here: <a * href="http://stackoverflow.com/a/22630970">Spektre's Stack Overflow * answer</a>. * * @param bv * Star's B-V magnitude * @return Star color */ public static Color bvToColor(double bv) { double t; double r = 0, g = 0, b = 0; bv = Math.max(-0.4, Math.min(2.0, bv)); if ((bv >= -0.40) && (bv < 0.00)) { t = (bv + 0.40) / (0.00 + 0.40); r = 0.61 + (0.11 * t) + (0.1 * t * t); } else if ((bv >= 0.00) && (bv < 0.40)) { t = (bv - 0.00) / (0.40 - 0.00); r = 0.83 + (0.17 * t); } else if ((bv >= 0.40) && (bv < 2.10)) { t = (bv - 0.40) / (2.10 - 0.40); r = 1.00; } if ((bv >= -0.40) && (bv < 0.00)) { t = (bv + 0.40) / (0.00 + 0.40); g = 0.70 + (0.07 * t) + (0.1 * t * t); } else if ((bv >= 0.00) && (bv < 0.40)) { t = (bv - 0.00) / (0.40 - 0.00); g = 0.87 + (0.11 * t); } else if ((bv >= 0.40) && (bv < 1.60)) { t = (bv - 0.40) / (1.60 - 0.40); g = 0.98 - (0.16 * t); } else if ((bv >= 1.60) && (bv < 2.00)) { t = (bv - 1.60) / (2.00 - 1.60); g = 0.82 - (0.5 * t * t); } if ((bv >= -0.40) && (bv < 0.40)) { t = (bv + 0.40) / (0.40 + 0.40); b = 1.00; } else if ((bv >= 0.40) && (bv < 1.50)) { t = (bv - 0.40) / (1.50 - 0.40); b = 1.00 - (0.47 * t) + (0.1 * t * t); } else if ((bv >= 1.50) && (bv < 1.94)) { t = (bv - 1.50) / (1.94 - 1.50); b = 0.63 - (0.6 * t * t); } return new Color((float) r, (float) g, (float) b); } /** * Convert the star type/class to an RGB color. * <p/> * Lookup table from here: <a href= * "http://www.vendian.org/mncharity/dir3/starcolor/UnstableURLs/starcolors.html" * >http://www.vendian.org/</a> * * @param type * Star type (eg G4) * @param classs * Star class (eg IV) * @return Star color */ @SuppressWarnings("nls") public static Color typeClassToColor(String type, String classs) { if ("O5".equals(type) && "V".equals(classs)) { return new Color(155, 176, 255); } if ("O6".equals(type) && "V".equals(classs)) { return new Color(162, 184, 255); } if ("O7".equals(type) && "V".equals(classs)) { return new Color(157, 177, 255); } if ("O8".equals(type) && "V".equals(classs)) { return new Color(157, 177, 255); } if ("O9".equals(type) && "V".equals(classs)) { return new Color(154, 178, 255); } if ("O9.5".equals(type) && "V".equals(classs)) { return new Color(164, 186, 255); } if ("B0".equals(type) && "V".equals(classs)) { return new Color(156, 178, 255); } if ("B0.5".equals(type) && "V".equals(classs)) { return new Color(167, 188, 255); } if ("B1".equals(type) && "V".equals(classs)) { return new Color(160, 182, 255); } if ("B2".equals(type) && "V".equals(classs)) { return new Color(160, 180, 255); } if ("B3".equals(type) && "V".equals(classs)) { return new Color(165, 185, 255); } if ("B4".equals(type) && "V".equals(classs)) { return new Color(164, 184, 255); } if ("B5".equals(type) && "V".equals(classs)) { return new Color(170, 191, 255); } if ("B6".equals(type) && "V".equals(classs)) { return new Color(172, 189, 255); } if ("B7".equals(type) && "V".equals(classs)) { return new Color(173, 191, 255); } if ("B8".equals(type) && "V".equals(classs)) { return new Color(177, 195, 255); } if ("B9".equals(type) && "V".equals(classs)) { return new Color(181, 198, 255); } if ("B9.5".equals(type) && "V".equals(classs)) { //added, interpolated between above and below return new Color(183, 199, 255); } if ("A0".equals(type) && "V".equals(classs)) { return new Color(185, 201, 255); } if ("A1".equals(type) && "V".equals(classs)) { return new Color(181, 199, 255); } if ("A2".equals(type) && "V".equals(classs)) { return new Color(187, 203, 255); } if ("A3".equals(type) && "V".equals(classs)) { return new Color(191, 207, 255); } if ("A5".equals(type) && "V".equals(classs)) { return new Color(202, 215, 255); } if ("A6".equals(type) && "V".equals(classs)) { return new Color(199, 212, 255); } if ("A7".equals(type) && "V".equals(classs)) { return new Color(200, 213, 255); } if ("A8".equals(type) && "V".equals(classs)) { return new Color(213, 222, 255); } if ("A9".equals(type) && "V".equals(classs)) { return new Color(219, 224, 255); } if ("F0".equals(type) && "V".equals(classs)) { return new Color(224, 229, 255); } if ("F1".equals(type) && "V".equals(classs)) { //added, interpolated between above and below return new Color(230, 234, 255); } if ("F2".equals(type) && "V".equals(classs)) { return new Color(236, 239, 255); } if ("F4".equals(type) && "V".equals(classs)) { return new Color(224, 226, 255); } if ("F5".equals(type) && "V".equals(classs)) { return new Color(248, 247, 255); } if ("F6".equals(type) && "V".equals(classs)) { return new Color(244, 241, 255); } if ("F7".equals(type) && "V".equals(classs)) { return new Color(246, 243, 255); } if ("F8".equals(type) && "V".equals(classs)) { return new Color(255, 247, 252); } if ("F9".equals(type) && "V".equals(classs)) { return new Color(255, 247, 252); } if ("G0".equals(type) && "V".equals(classs)) { return new Color(255, 248, 252); } if ("G1".equals(type) && "V".equals(classs)) { return new Color(255, 247, 248); } if ("G2".equals(type) && "V".equals(classs)) { return new Color(255, 245, 242); } if ("G4".equals(type) && "V".equals(classs)) { return new Color(255, 241, 229); } if ("G5".equals(type) && "V".equals(classs)) { return new Color(255, 244, 234); } if ("G6".equals(type) && "V".equals(classs)) { return new Color(255, 244, 235); } if ("G7".equals(type) && "V".equals(classs)) { return new Color(255, 244, 235); } if ("G8".equals(type) && "V".equals(classs)) { return new Color(255, 237, 222); } if ("G9".equals(type) && "V".equals(classs)) { return new Color(255, 239, 221); } if ("K0".equals(type) && "V".equals(classs)) { return new Color(255, 238, 221); } if ("K1".equals(type) && "V".equals(classs)) { return new Color(255, 224, 188); } if ("K2".equals(type) && "V".equals(classs)) { return new Color(255, 227, 196); } if ("K3".equals(type) && "V".equals(classs)) { return new Color(255, 222, 195); } if ("K4".equals(type) && "V".equals(classs)) { return new Color(255, 216, 181); } if ("K5".equals(type) && "V".equals(classs)) { return new Color(255, 210, 161); } if ("K7".equals(type) && "V".equals(classs)) { return new Color(255, 199, 142); } if ("K8".equals(type) && "V".equals(classs)) { return new Color(255, 209, 174); } if ("M0".equals(type) && "V".equals(classs)) { return new Color(255, 195, 139); } if ("M1".equals(type) && "V".equals(classs)) { return new Color(255, 204, 142); } if ("M2".equals(type) && "V".equals(classs)) { return new Color(255, 196, 131); } if ("M3".equals(type) && "V".equals(classs)) { return new Color(255, 206, 129); } if ("M4".equals(type) && "V".equals(classs)) { return new Color(255, 201, 127); } if ("M5".equals(type) && "V".equals(classs)) { return new Color(255, 204, 111); } if ("M6".equals(type) && "V".equals(classs)) { return new Color(255, 195, 112); } if ("M8".equals(type) && "V".equals(classs)) { return new Color(255, 198, 109); } if ("B1".equals(type) && "IV".equals(classs)) { return new Color(157, 180, 255); } if ("B2".equals(type) && "IV".equals(classs)) { return new Color(159, 179, 255); } if ("B3".equals(type) && "IV".equals(classs)) { return new Color(166, 188, 255); } if ("B6".equals(type) && "IV".equals(classs)) { return new Color(175, 194, 255); } if ("B7".equals(type) && "IV".equals(classs)) { return new Color(170, 189, 255); } if ("B9".equals(type) && "IV".equals(classs)) { return new Color(180, 197, 255); } if ("A0".equals(type) && "IV".equals(classs)) { return new Color(179, 197, 255); } if ("A3".equals(type) && "IV".equals(classs)) { return new Color(190, 205, 255); } if ("A4".equals(type) && "IV".equals(classs)) { return new Color(195, 210, 255); } if ("A5".equals(type) && "IV".equals(classs)) { return new Color(212, 220, 255); } if ("A7".equals(type) && "IV".equals(classs)) { return new Color(192, 207, 255); } if ("A9".equals(type) && "IV".equals(classs)) { return new Color(224, 227, 255); } if ("F0".equals(type) && "IV".equals(classs)) { return new Color(218, 224, 255); } if ("F2".equals(type) && "IV".equals(classs)) { return new Color(227, 230, 255); } if ("F3".equals(type) && "IV".equals(classs)) { return new Color(227, 230, 255); } if ("F5".equals(type) && "IV".equals(classs)) { return new Color(241, 239, 255); } if ("F7".equals(type) && "IV".equals(classs)) { return new Color(240, 239, 255); } if ("F8".equals(type) && "IV".equals(classs)) { return new Color(255, 252, 253); } if ("G0".equals(type) && "IV".equals(classs)) { return new Color(255, 248, 245); } if ("G2".equals(type) && "IV".equals(classs)) { return new Color(255, 244, 242); } if ("G3".equals(type) && "IV".equals(classs)) { return new Color(255, 238, 226); } if ("G4".equals(type) && "IV".equals(classs)) { return new Color(255, 245, 238); } if ("G5".equals(type) && "IV".equals(classs)) { return new Color(255, 235, 213); } if ("G6".equals(type) && "IV".equals(classs)) { return new Color(255, 242, 234); } if ("G7".equals(type) && "IV".equals(classs)) { return new Color(255, 231, 205); } if ("G8".equals(type) && "IV".equals(classs)) { return new Color(255, 233, 211); } if ("K0".equals(type) && "IV".equals(classs)) { return new Color(255, 225, 189); } if ("K1".equals(type) && "IV".equals(classs)) { return new Color(255, 216, 171); } if ("K2".equals(type) && "IV".equals(classs)) { return new Color(255, 229, 202); } if ("K3".equals(type) && "IV".equals(classs)) { return new Color(255, 219, 167); } if ("O7".equals(type) && "III".equals(classs)) { return new Color(158, 177, 255); } if ("O8".equals(type) && "III".equals(classs)) { return new Color(157, 178, 255); } if ("O9".equals(type) && "III".equals(classs)) { return new Color(158, 177, 255); } if ("B0".equals(type) && "III".equals(classs)) { return new Color(158, 177, 255); } if ("B1".equals(type) && "III".equals(classs)) { return new Color(158, 177, 255); } if ("B2".equals(type) && "III".equals(classs)) { return new Color(159, 180, 255); } if ("B3".equals(type) && "III".equals(classs)) { return new Color(163, 187, 255); } if ("B5".equals(type) && "III".equals(classs)) { return new Color(168, 189, 255); } if ("B7".equals(type) && "III".equals(classs)) { return new Color(171, 191, 255); } if ("B9".equals(type) && "III".equals(classs)) { return new Color(178, 195, 255); } if ("A0".equals(type) && "III".equals(classs)) { return new Color(188, 205, 255); } if ("A3".equals(type) && "III".equals(classs)) { return new Color(189, 203, 255); } if ("A5".equals(type) && "III".equals(classs)) { return new Color(202, 215, 255); } if ("A6".equals(type) && "III".equals(classs)) { return new Color(209, 219, 255); } if ("A7".equals(type) && "III".equals(classs)) { return new Color(210, 219, 255); } if ("A8".equals(type) && "III".equals(classs)) { return new Color(209, 219, 255); } if ("A9".equals(type) && "III".equals(classs)) { return new Color(209, 219, 255); } if ("F0".equals(type) && "III".equals(classs)) { return new Color(213, 222, 255); } if ("F2".equals(type) && "III".equals(classs)) { return new Color(241, 241, 255); } if ("F4".equals(type) && "III".equals(classs)) { return new Color(241, 240, 255); } if ("F5".equals(type) && "III".equals(classs)) { return new Color(242, 240, 255); } if ("F6".equals(type) && "III".equals(classs)) { return new Color(241, 240, 255); } if ("F7".equals(type) && "III".equals(classs)) { return new Color(241, 240, 255); } if ("G0".equals(type) && "III".equals(classs)) { return new Color(255, 242, 233); } if ("G1".equals(type) && "III".equals(classs)) { return new Color(255, 243, 233); } if ("G2".equals(type) && "III".equals(classs)) { return new Color(255, 243, 233); } if ("G3".equals(type) && "III".equals(classs)) { return new Color(255, 243, 233); } if ("G4".equals(type) && "III".equals(classs)) { return new Color(255, 243, 233); } if ("G5".equals(type) && "III".equals(classs)) { return new Color(255, 236, 211); } if ("G6".equals(type) && "III".equals(classs)) { return new Color(255, 236, 215); } if ("G8".equals(type) && "III".equals(classs)) { return new Color(255, 231, 199); } if ("G9".equals(type) && "III".equals(classs)) { return new Color(255, 231, 196); } if ("K0".equals(type) && "III".equals(classs)) { return new Color(255, 227, 190); } if ("K1".equals(type) && "III".equals(classs)) { return new Color(255, 223, 181); } if ("K2".equals(type) && "III".equals(classs)) { return new Color(255, 221, 175); } if ("K3".equals(type) && "III".equals(classs)) { return new Color(255, 216, 167); } if ("K4".equals(type) && "III".equals(classs)) { return new Color(255, 211, 146); } if ("K5".equals(type) && "III".equals(classs)) { return new Color(255, 204, 138); } if ("K7".equals(type) && "III".equals(classs)) { return new Color(255, 208, 142); } if ("M0".equals(type) && "III".equals(classs)) { return new Color(255, 203, 132); } if ("M1".equals(type) && "III".equals(classs)) { return new Color(255, 200, 121); } if ("M2".equals(type) && "III".equals(classs)) { return new Color(255, 198, 118); } if ("M3".equals(type) && "III".equals(classs)) { return new Color(255, 200, 119); } if ("M4".equals(type) && "III".equals(classs)) { return new Color(255, 206, 127); } if ("M5".equals(type) && "III".equals(classs)) { return new Color(255, 197, 124); } if ("M6".equals(type) && "III".equals(classs)) { return new Color(255, 178, 121); } if ("M7".equals(type) && "III".equals(classs)) { return new Color(255, 165, 97); } if ("M8".equals(type) && "III".equals(classs)) { return new Color(255, 167, 97); } if ("M9".equals(type) && "III".equals(classs)) { return new Color(255, 233, 154); } if ("B2".equals(type) && "II".equals(classs)) { return new Color(165, 192, 255); } if ("B5".equals(type) && "II".equals(classs)) { return new Color(175, 195, 255); } if ("F0".equals(type) && "II".equals(classs)) { return new Color(203, 217, 255); } if ("F2".equals(type) && "II".equals(classs)) { return new Color(229, 233, 255); } if ("G5".equals(type) && "II".equals(classs)) { return new Color(255, 235, 203); } if ("M3".equals(type) && "II".equals(classs)) { return new Color(255, 201, 119); } if ("O9".equals(type) && "I".equals(classs)) { return new Color(164, 185, 255); } if ("B0".equals(type) && "I".equals(classs)) { return new Color(161, 189, 255); } if ("B1".equals(type) && "I".equals(classs)) { return new Color(168, 193, 255); } if ("B2".equals(type) && "I".equals(classs)) { return new Color(177, 196, 255); } if ("B3".equals(type) && "I".equals(classs)) { return new Color(175, 194, 255); } if ("B4".equals(type) && "I".equals(classs)) { return new Color(187, 203, 255); } if ("B5".equals(type) && "I".equals(classs)) { return new Color(179, 202, 255); } if ("B6".equals(type) && "I".equals(classs)) { return new Color(191, 207, 255); } if ("B7".equals(type) && "I".equals(classs)) { return new Color(195, 209, 255); } if ("B8".equals(type) && "I".equals(classs)) { return new Color(182, 206, 255); } if ("B9".equals(type) && "I".equals(classs)) { return new Color(204, 216, 255); } if ("A0".equals(type) && "I".equals(classs)) { return new Color(187, 206, 255); } if ("A1".equals(type) && "I".equals(classs)) { return new Color(214, 223, 255); } if ("A2".equals(type) && "I".equals(classs)) { return new Color(199, 214, 255); } if ("A5".equals(type) && "I".equals(classs)) { return new Color(223, 229, 255); } if ("F0".equals(type) && "I".equals(classs)) { return new Color(202, 215, 255); } if ("F2".equals(type) && "I".equals(classs)) { return new Color(244, 243, 255); } if ("F5".equals(type) && "I".equals(classs)) { return new Color(219, 225, 255); } if ("F8".equals(type) && "I".equals(classs)) { return new Color(255, 252, 247); } if ("G0".equals(type) && "I".equals(classs)) { return new Color(255, 239, 219); } if ("G2".equals(type) && "I".equals(classs)) { return new Color(255, 236, 205); } if ("G3".equals(type) && "I".equals(classs)) { return new Color(255, 231, 203); } if ("G5".equals(type) && "I".equals(classs)) { return new Color(255, 230, 183); } if ("G8".equals(type) && "I".equals(classs)) { return new Color(255, 220, 167); } if ("K0".equals(type) && "I".equals(classs)) { return new Color(255, 221, 181); } if ("K1".equals(type) && "I".equals(classs)) { return new Color(255, 220, 177); } if ("K2".equals(type) && "I".equals(classs)) { return new Color(255, 211, 135); } if ("K3".equals(type) && "I".equals(classs)) { return new Color(255, 204, 128); } if ("K4".equals(type) && "I".equals(classs)) { return new Color(255, 201, 118); } if ("K5".equals(type) && "I".equals(classs)) { return new Color(255, 209, 154); } if ("M0".equals(type) && "I".equals(classs)) { return new Color(255, 204, 143); } if ("M1".equals(type) && "I".equals(classs)) { return new Color(255, 202, 138); } if ("M2".equals(type) && "I".equals(classs)) { return new Color(255, 193, 104); } if ("M3".equals(type) && "I".equals(classs)) { return new Color(255, 192, 118); } if ("M4".equals(type) && "I".equals(classs)) { return new Color(255, 185, 104); } return null; } }