]> gerrit.simantics Code Review - simantics/district.git/blob - org.simantics.district.network/src/org/simantics/district/network/visualisations/model/DynamicColorMap.java
Add support for gradients in dynamic visualisations
[simantics/district.git] / org.simantics.district.network / src / org / simantics / district / network / visualisations / model / DynamicColorMap.java
1 package org.simantics.district.network.visualisations.model;
2
3 import java.awt.Color;
4 import java.util.List;
5
6 public class DynamicColorMap {
7     
8     private String label;
9     private List<RGBIntensity> intensities;
10     
11     public DynamicColorMap(String label, List<RGBIntensity> intensities) {
12         this.label = label;
13         this.intensities = intensities;
14     }
15
16     public String getLabel() {
17         return label;
18     }
19
20     public List<RGBIntensity> getIntensities() {
21         return intensities;
22     }
23
24     public static class RGBIntensity {
25         
26         private double red;
27         private double green;
28         private double blue;
29         
30         public RGBIntensity(double red, double green, double blue) {
31             this.red = red;
32             this.green = green;
33             this.blue = blue;
34         }
35
36         public double getRed() {
37             return red;
38         }
39
40         public double getGreen() {
41             return green;
42         }
43
44         public double getBlue() {
45             return blue;
46         }
47     }
48
49     public Color getColor(double value, boolean useGradient, double defaultMin, double defaultMax) {
50         List<RGBIntensity> intensities = getIntensities();
51         
52         double gap = defaultMax - defaultMin;
53         double singleGap = gap / intensities.size();
54         
55         double threshold = defaultMin;
56         int i = 0;
57         while (i < intensities.size() - 1) {
58             threshold = threshold + singleGap;
59             if (value <= threshold) {
60                 break;
61             }
62             i++;
63         }
64         
65         RGBIntensity intensity = intensities.get(i);
66         if (useGradient) {
67             
68             RGBIntensity upperLimitIntensity;
69             if (i + 1 != intensities.size())
70                 upperLimitIntensity = intensities.get(i + 1);
71             else
72                 upperLimitIntensity = intensity;
73             
74             double minRed = intensity.getRed();
75             double minGreen = intensity.getGreen();
76             double minBlue = intensity.getBlue();
77             
78             double maxRed = upperLimitIntensity.getRed();
79             double maxGreen = upperLimitIntensity.getGreen();
80             double maxBlue = upperLimitIntensity.getBlue();
81             
82             double delta = Math.max(value - (defaultMin + singleGap * i), 0);
83             
84             double d = delta / singleGap;
85             
86             double redDelta = (maxRed - minRed) * d;
87             double greenDelta = (maxGreen - minGreen) * d;
88             double blueDelta = (maxBlue - minBlue) * d;
89             return new Color((float)(minRed + redDelta), (float)(minGreen + greenDelta), (float)(minBlue + blueDelta));
90         } else {
91             return new Color((float)intensity.getRed(), (float)intensity.getGreen(), (float)intensity.getBlue());
92         }
93     }
94 }