package org.simantics.district.network.visualisations.model; import java.awt.Color; import java.util.List; public class DynamicColorMap { private String label; private List intensities; public DynamicColorMap(String label, List intensities) { this.label = label; this.intensities = intensities; } public String getLabel() { return label; } public List getIntensities() { return intensities; } public static class RGBIntensity { private double red; private double green; private double blue; public RGBIntensity(double red, double green, double blue) { this.red = red; this.green = green; this.blue = blue; } public double getRed() { return red; } public double getGreen() { return green; } public double getBlue() { return blue; } } public Color getColor(double value, boolean useGradient, double defaultMin, double defaultMax) { List intensities = getIntensities(); double gap = defaultMax - defaultMin; double singleGap = gap / intensities.size(); double threshold = defaultMin; int i = 0; while (i < intensities.size() - 1) { threshold = threshold + singleGap; if (value <= threshold) { break; } i++; } RGBIntensity intensity = intensities.get(i); if (useGradient) { RGBIntensity upperLimitIntensity; if (i + 1 != intensities.size()) upperLimitIntensity = intensities.get(i + 1); else upperLimitIntensity = intensity; double minRed = intensity.getRed(); double minGreen = intensity.getGreen(); double minBlue = intensity.getBlue(); double maxRed = upperLimitIntensity.getRed(); double maxGreen = upperLimitIntensity.getGreen(); double maxBlue = upperLimitIntensity.getBlue(); double delta = Math.max(value - (defaultMin + singleGap * i), 0); double d = delta / singleGap; double redDelta = (maxRed - minRed) * d; double greenDelta = (maxGreen - minGreen) * d; double blueDelta = (maxBlue - minBlue) * d; return new Color((float)(minRed + redDelta), (float)(minGreen + greenDelta), (float)(minBlue + blueDelta)); } else { return new Color((float)intensity.getRed(), (float)intensity.getGreen(), (float)intensity.getBlue()); } } }