/*
* Copyright (C) 2008-2015 by Holger Arndt
*
* This file is part of the Universal Java Matrix Package (UJMP).
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership and licensing.
*
* UJMP is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* UJMP 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with UJMP; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
package org.ujmp.gui.colormap;
import java.awt.Color;
import org.ujmp.core.util.ColorMap;
public class ColorMapper {
private double min = 0.0;
private double max = 10.0;
private double a = 10;
private double b = 0;
private ColorMap colorMap = null;
private int colorCount = 0;
public ColorMap getColorMap() {
return colorMap;
}
public void setColorMap(ColorMap colorMap) {
this.colorMap = colorMap;
this.colorCount = colorMap.size();
this.a = colorCount / (max - min);
this.b = -min * a;
}
public double getMax() {
return max;
}
public void setMax(double max) {
if (this.max >= max) {
return;
}
if (max == this.min) {
this.min = max - 10;
}
this.max = max;
this.a = colorCount / (max - min);
this.b = -min * a;
}
public double getMin() {
return min;
}
public void setMin(double min) {
if (this.min <= min) {
return;
}
if (min == this.max) {
this.max = min + 10;
}
this.min = min;
this.a = colorCount / (max - min);
this.b = -min * a;
}
public ColorMapper() {
colorMap = ColorMap.DEFAULT;
colorCount = colorMap.size();
setMax(1);
setMin(0);
}
public ColorMapper(double minValue, double maxValue) {
this();
setMax(maxValue);
setMin(minValue);
}
public Color fromDouble2(double v) {
return colorMap.get(getIndex(v));
}
public static final Color fromDouble(double v) {
// inf = 255 255 0 yellow
// 1 = 0 255 0 green
// 0 = 0 0 0 black
// -1 = 255 0 0 red
// -inf = 255 0 255 magenta
// nan = 0 255 255 cyan
if (v == Double.MIN_VALUE || Double.isNaN(v))
return (Color.MAGENTA);
else if (Double.isInfinite(v))
return (Color.CYAN);
else if (v > 1.0)
return (ColorMap.colorGreenToYellow[(int) (255.0 * Math.tanh((v - 1.0) / 10.0))]);
else if (v > 0.0)
return (ColorMap.colorBlackToGreen[(int) (255.0 * v)]);
else if (v > -1.0)
return (ColorMap.colorRedToBlack[(int) (255.0 * (v + 1.0))]);
else
return (ColorMap.colorRedToMagenta[(int) (255.0 * Math.tanh((-v - 1.0) / 10.0))]);
}
public Color fromString(String s) {
if (s == null)
return Color.black;
int hc = Math.abs(hash(s.hashCode()));
int r = 192 + (hc % 256) / 4;
hc = hc / 256;
int g = 192 + (hc % 256) / 4;
hc = hc / 256;
int b = 192 + (hc % 256) / 4;
return new Color(r > 255 ? 255 : r, g > 255 ? 255 : g, b > 255 ? 255 : b);
}
private static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
public Color fromObject(Object v) {
if (v == null) {
return Color.black;
}
if (v instanceof Double) {
return fromDouble((Double) v);
}
return fromString(v.toString());
}
private int getIndex(double v) {
int index = (int) (v * a + b);
return index;
}
}