Irgendwie hatten sich doch einige Bugs in meinen Code eingeschlichen. Hier
nun ein funktionierendes Beispiel:
package de.jnana.dclj;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
public abstract class PseudoColorScale {
private final double minValue;
private final double maxValue;
protected PseudoColorScale(double minValue, double maxValue) {
if (minValue >= maxValue) {
throw new IllegalArgumentException();
}
this.minValue = minValue;
this.maxValue = maxValue;
}
public static PseudoColorScale getLinearInstance(double minValue,
double maxValue) {
return new PseudoColorScale(minValue, maxValue) {
@Override
protected double calcRed(double normalized) {
if (normalized <= 0.4d) {
return 0d;
}
if (normalized >= 0.6d) {
return 1d;
}
return 5d * (normalized - 0.4d);
}
@Override
protected double calcGreen(double normalized) {
if ((normalized >= 0.2d) && (normalized <= 0.6d)) {
return 1d;
}
if (normalized >= 0.8d) {
return 0d;
}
if (normalized > 0.6d) {
return 5d * (0.8d - normalized);
} else {
return 5d * normalized;
}
}
@Override
protected double calcBlue(double normalized) {
if (normalized <= 0.2d) {
return 1d;
}
if ((normalized >= 0.4d) && (normalized <= 0.8d)) {
return 0d;
}
if (normalized > 0.8d) {
return 5d * (normalized - 0.8d);
} else {
return 5d * (0.4d - normalized);
}
}
};
}
public static PseudoColorScale getSinusoidInstance(double minValue,
double maxValue) {
return new PseudoColorScale(minValue, maxValue) {
@Override
protected double normalize(double value) {
return super.normalize(value) * Math.PI * 2d;
}
private double sinusoid(double x) {
return (1d + Math.sin(x)) / 2d;
}
@Override
protected double calcRed(double normalized) {
return sinusoid(normalized + Math.PI);
}
@Override
protected double calcGreen(double normalized) {
return sinusoid(normalized - Math.PI / 2d);
}
@Override
protected double calcBlue(double normalized) {
return sinusoid(normalized);
}
};
}
public double[] calcColor(double value, double[] color) {
if ((minValue > value) || (maxValue < value)) {
throw new IllegalArgumentException("value");
}
double[] rv = color;
if (rv == null) {
rv = new double[3];
} else if (rv.length != 3) {
throw new IllegalArgumentException("color");
}
double normalized = normalize(value);
rv[0] = calcRed(normalized);
rv[1] = calcGreen(normalized);
rv[2] = calcBlue(normalized);
return rv;
}
protected double normalize(double value) {
return (value - minValue) / (maxValue - minValue);
}
protected abstract double calcRed(double normalized);
protected abstract double calcGreen(double normalized);
protected abstract double calcBlue(double normalized);
public static void main(String[] args) {
class ColorPanel extends JPanel {
private PseudoColorScale scale;
ColorPanel(PseudoColorScale scale) {
this.scale = scale;
setPreferredSize(new Dimension(320, 120));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
double[] c = new double[3];
int w = getWidth();
int h = getHeight();
for (int v = 0; v < w; v++) {
scale.calcColor((double) v / (double) w, c);
g.setColor(new Color((float) c[0], (float) c[1],
(float) c[2]));
g.drawLine(v, 0, v, h);
}
}
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(
new ColorPanel(PseudoColorScale.getLinearInstance(0d, 1d)),
BorderLayout.NORTH);
frame.getContentPane().add(
new ColorPanel(PseudoColorScale.getSinusoidInstance(0d, 1d)),
BorderLayout.SOUTH);
frame.pack();
frame.setVisible(true);
}
}
cu