Skip to content

Commit

Permalink
Merge pull request #82 from philipbelesky/feature/perceptual-ramps
Browse files Browse the repository at this point in the history
Rework colormaps and add new options (closes #19)
  • Loading branch information
mariuszhermansdorfer committed Aug 19, 2021
2 parents 4f8de3d + 0ebf817 commit 9801a79
Show file tree
Hide file tree
Showing 6 changed files with 102 additions and 86 deletions.
6 changes: 4 additions & 2 deletions SandWorm/Analysis.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,10 @@ public abstract class MeshColorAnalysis : MeshAnalysis
public MeshColorAnalysis(string menuName) : base(menuName, true)
{
} // Note: is mutually exclusive

public abstract void ComputeLookupTableForAnalysis(double sensorElevation, double gradientRange);

// Provide two methods for overloading; one for custom-gradient-using options and one for the others
public virtual void ComputeLookupTableForAnalysis(double sensorElevation, double gradientRange) { return; }
public virtual void ComputeLookupTableForAnalysis(double sensorElevation, double gradientRange, int paletteOptions = 0) { return; }

public void ComputeLinearRanges(params VisualisationRangeWithColor[] lookUpRanges)
{
Expand Down
121 changes: 78 additions & 43 deletions SandWorm/Analytics/ColorPalettes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,77 +5,112 @@ namespace SandWorm
{
public static class ColorPalettes
{
public static Color[] GenerateColorPalettes(Structs.ColorPalettes palette, List<Color> customColors)
public static List<Color> GenerateColorPalettes(Structs.ColorPalettes palette, List<Color> customColors)
{
Color[] colorPalettes = new Color[5];
List<Color> paletteSwatches = new List<Color>();

switch (palette)
{
case Structs.ColorPalettes.Custom:
if (customColors.Count == 0)
break;
for (int i = 0; i < colorPalettes.Length; i++)
colorPalettes[i] = customColors[i];
if (customColors.Count == 0) // No inputs provided; use placeholder
paletteSwatches.Add(Color.FromArgb(122, 122, 122));
paletteSwatches.Add(Color.FromArgb(122, 122, 122));

for (int i = 0; i < customColors.Count; i++)
paletteSwatches.Add(customColors[i]);
break;

case Structs.ColorPalettes.Chile:
colorPalettes[0] = Color.FromArgb(38, 115, 0);
colorPalettes[1] = Color.FromArgb(124, 191, 48);
colorPalettes[2] = Color.FromArgb(255, 247, 52);
colorPalettes[3] = Color.FromArgb(196, 65, 0);
colorPalettes[4] = Color.FromArgb(230, 188, 167);
paletteSwatches.Add(Color.FromArgb(38, 115, 0));
paletteSwatches.Add(Color.FromArgb(124, 191, 48));
paletteSwatches.Add(Color.FromArgb(255, 247, 52));
paletteSwatches.Add(Color.FromArgb(196, 65, 0));
paletteSwatches.Add(Color.FromArgb(230, 188, 167));
break;

case Structs.ColorPalettes.Desert:
colorPalettes[0] = Color.FromArgb(55, 101, 84);
colorPalettes[1] = Color.FromArgb(73, 117, 100);
colorPalettes[2] = Color.FromArgb(172, 196, 160);
colorPalettes[3] = Color.FromArgb(148, 131, 85);
colorPalettes[4] = Color.FromArgb(217, 209, 190);
paletteSwatches.Add(Color.FromArgb(55, 101, 84));
paletteSwatches.Add(Color.FromArgb(73, 117, 100));
paletteSwatches.Add(Color.FromArgb(172, 196, 160));
paletteSwatches.Add(Color.FromArgb(148, 131, 85));
paletteSwatches.Add(Color.FromArgb(217, 209, 190));
break;

case Structs.ColorPalettes.Europe:
colorPalettes[0] = Color.FromArgb(36, 121, 36);
colorPalettes[1] = Color.FromArgb(89, 148, 54);
colorPalettes[2] = Color.FromArgb(181, 195, 80);
colorPalettes[3] = Color.FromArgb(208, 191, 94);
colorPalettes[4] = Color.FromArgb(115, 24, 19);
paletteSwatches.Add(Color.FromArgb(36, 121, 36));
paletteSwatches.Add(Color.FromArgb(89, 148, 54));
paletteSwatches.Add(Color.FromArgb(181, 195, 80));
paletteSwatches.Add(Color.FromArgb(208, 191, 94));
paletteSwatches.Add(Color.FromArgb(115, 24, 19));
break;

case Structs.ColorPalettes.Greyscale:
colorPalettes[0] = Color.FromArgb(40, 40, 40);
colorPalettes[1] = Color.FromArgb(80, 80, 80);
colorPalettes[2] = Color.FromArgb(120, 120, 120);
colorPalettes[3] = Color.FromArgb(160, 160, 160);
colorPalettes[4] = Color.FromArgb(200, 200, 200);
paletteSwatches.Add(Color.FromArgb(40, 40, 40));
paletteSwatches.Add(Color.FromArgb(80, 80, 80));
paletteSwatches.Add(Color.FromArgb(120, 120, 120));
paletteSwatches.Add(Color.FromArgb(160, 160, 160));
paletteSwatches.Add(Color.FromArgb(200, 200, 200));
break;

case Structs.ColorPalettes.Dune:
colorPalettes[0] = Color.FromArgb(80, 80, 80);
colorPalettes[1] = Color.FromArgb(122, 91, 76);
colorPalettes[2] = Color.FromArgb(191, 118, 40);
colorPalettes[3] = Color.FromArgb(240, 173, 50);
colorPalettes[4] = Color.FromArgb(255, 210, 128);
paletteSwatches.Add(Color.FromArgb(80, 80, 80));
paletteSwatches.Add(Color.FromArgb(122, 91, 76));
paletteSwatches.Add(Color.FromArgb(191, 118, 40));
paletteSwatches.Add(Color.FromArgb(240, 173, 50));
paletteSwatches.Add(Color.FromArgb(255, 210, 128));
break;

case Structs.ColorPalettes.Ocean:
colorPalettes[0] = Color.FromArgb(47, 34, 58);
colorPalettes[1] = Color.FromArgb(62, 90, 146);
colorPalettes[2] = Color.FromArgb(80, 162, 162);
colorPalettes[3] = Color.FromArgb(152, 218, 164);
colorPalettes[4] = Color.FromArgb(250, 250, 200);
paletteSwatches.Add(Color.FromArgb(47, 34, 58));
paletteSwatches.Add(Color.FromArgb(62, 90, 146));
paletteSwatches.Add(Color.FromArgb(80, 162, 162));
paletteSwatches.Add(Color.FromArgb(152, 218, 164));
paletteSwatches.Add(Color.FromArgb(250, 250, 200));
break;

case Structs.ColorPalettes.Turbo:
paletteSwatches.Add(Color.FromArgb(48, 18, 59));
paletteSwatches.Add(Color.FromArgb(65, 69, 171));
paletteSwatches.Add(Color.FromArgb(70,117,237));
paletteSwatches.Add(Color.FromArgb(57, 162, 252));
paletteSwatches.Add(Color.FromArgb(27, 207, 212));
paletteSwatches.Add(Color.FromArgb(36, 236, 166));
paletteSwatches.Add(Color.FromArgb(97, 252, 108));
paletteSwatches.Add(Color.FromArgb(164, 252, 59));
paletteSwatches.Add(Color.FromArgb(209, 232, 52));
paletteSwatches.Add(Color.FromArgb(243, 198, 58));
paletteSwatches.Add(Color.FromArgb(254, 155, 45));
paletteSwatches.Add(Color.FromArgb(243, 99, 21));
paletteSwatches.Add(Color.FromArgb(217, 56, 6));
paletteSwatches.Add(Color.FromArgb(177, 25, 1));
paletteSwatches.Add(Color.FromArgb(122, 4, 2));
break;

case Structs.ColorPalettes.Rainbow:
colorPalettes[0] = Color.FromArgb(0, 0, 255);
colorPalettes[1] = Color.FromArgb(0, 220, 255);
colorPalettes[2] = Color.FromArgb(140, 255, 110);
colorPalettes[3] = Color.FromArgb(255, 145, 0);
colorPalettes[4] = Color.FromArgb(255, 0, 0);
case Structs.ColorPalettes.Viridis:
paletteSwatches.Add(Color.FromArgb(52, 0, 66));
paletteSwatches.Add(Color.FromArgb(55, 8, 85));
paletteSwatches.Add(Color.FromArgb(55, 23, 100));
paletteSwatches.Add(Color.FromArgb(53, 37, 110));
paletteSwatches.Add(Color.FromArgb(48, 52, 117));
paletteSwatches.Add(Color.FromArgb(44, 65, 121));
paletteSwatches.Add(Color.FromArgb(39, 80, 123));
paletteSwatches.Add(Color.FromArgb(36, 93, 123));
paletteSwatches.Add(Color.FromArgb(33, 106, 123));
paletteSwatches.Add(Color.FromArgb(31, 120, 122));
paletteSwatches.Add(Color.FromArgb(30, 134, 120));
paletteSwatches.Add(Color.FromArgb(32, 148, 115));
paletteSwatches.Add(Color.FromArgb(38, 162, 108));
paletteSwatches.Add(Color.FromArgb(52, 178, 98));
paletteSwatches.Add(Color.FromArgb(73, 190, 84));
paletteSwatches.Add(Color.FromArgb(101, 202, 68));
paletteSwatches.Add(Color.FromArgb(132, 212, 50));
paletteSwatches.Add(Color.FromArgb(171, 219, 32));
paletteSwatches.Add(Color.FromArgb(212, 225, 21));
paletteSwatches.Add(Color.FromArgb(252, 229, 30));
break;
}

return colorPalettes;
return paletteSwatches;
}
}
}
48 changes: 18 additions & 30 deletions SandWorm/Analytics/Elevation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,21 @@ public class Elevation : Analysis.MeshColorAnalysis
private int _lastSensorElevation; // Keep track of prior values to recalculate only as needed
private double _lastGradientRange;
private Structs.ColorPalettes _colorPalette = Structs.ColorPalettes.Europe;
Color[] colorPalettes;
List<Color> paletteSwatches; // Color values for the given palette

public Elevation() : base("Visualise Elevation")
{
}

public Color[] GetColorCloudForAnalysis(double[] pixelArray, double sensorElevation, double gradientRange, Structs.ColorPalettes colorPalette, List<Color> customColors)
public Color[] GetColorCloudForAnalysis(double[] pixelArray, double sensorElevation, double gradientRange,
Structs.ColorPalettes colorPalette, List<Color> customColors)
{
_colorPalette = colorPalette;
var sensorElevationRounded = (int)sensorElevation; // Convert once as it is done often
if (lookupTable == null || sensorElevationRounded != _lastSensorElevation || gradientRange != _lastGradientRange)
{
colorPalettes = ColorPalettes.GenerateColorPalettes(_colorPalette, customColors);

ComputeLookupTableForAnalysis(sensorElevation, gradientRange);
paletteSwatches = ColorPalettes.GenerateColorPalettes(_colorPalette, customColors);
ComputeLookupTableForAnalysis(sensorElevation, gradientRange, paletteSwatches.Count);
}

// Lookup elevation value in color table
Expand All @@ -41,34 +41,22 @@ public Color[] GetColorCloudForAnalysis(double[] pixelArray, double sensorElevat
return vertexColors;
}

public override void ComputeLookupTableForAnalysis(double sensorElevation, double gradientRange)
// Given the sensor's height from the table, map between vertical distance intervals and color palette values
public override void ComputeLookupTableForAnalysis(double sensorElevation, double gradientRange, int swatchCount)
{
var sElevationRange = new Analysis.VisualisationRangeWithColor
var elevationRanges = new Analysis.VisualisationRangeWithColor[swatchCount - 1];
for (int i = 0; i < swatchCount - 1; i++)
{
ValueSpan = (int)(gradientRange / 4),
ColorStart = new ColorHSL(colorPalettes[0]),
ColorEnd = new ColorHSL(colorPalettes[1])
};
var mElevationRange = new Analysis.VisualisationRangeWithColor
{
ValueSpan = (int)(gradientRange / 4),
ColorStart = new ColorHSL(colorPalettes[1]),
ColorEnd = new ColorHSL(colorPalettes[2])
};
var lElevationRange = new Analysis.VisualisationRangeWithColor
{
ValueSpan = (int)(gradientRange / 4),
ColorStart = new ColorHSL(colorPalettes[2]),
ColorEnd = new ColorHSL(colorPalettes[3])
};
var xlElevationRange = new Analysis.VisualisationRangeWithColor
{
ValueSpan = (int)(gradientRange / 4),
ColorStart = new ColorHSL(colorPalettes[3]),
ColorEnd = new ColorHSL(colorPalettes[4])
};
var elevationRange = new Analysis.VisualisationRangeWithColor
{
ValueSpan = (int)(gradientRange / swatchCount),
ColorStart = new ColorHSL(paletteSwatches[i]),
ColorEnd = new ColorHSL(paletteSwatches[i+1])
};
elevationRanges[i] = elevationRange;
}

ComputeLinearRanges(sElevationRange, mElevationRange, lElevationRange, xlElevationRange);
ComputeLinearRanges(elevationRanges);
_lastSensorElevation = (int)sensorElevation;
_lastGradientRange = gradientRange;
}
Expand Down
5 changes: 0 additions & 5 deletions SandWorm/Analytics/None.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,5 @@ public Color[] GetColorCloudForAnalysis()
var vertexColors = new Color[0];
return vertexColors; // Send back an empty array so mesh is transparent/uncolored
}

public override void ComputeLookupTableForAnalysis(double sensorElevation, double gradientRange)
{
return; // No lookup table necessary
}
}
}
5 changes: 0 additions & 5 deletions SandWorm/Analytics/RGB.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,5 @@ public Color[] GetColorCloudForAnalysis(Color[] pixelColors)

return vertexColors;
}

public override void ComputeLookupTableForAnalysis(double sensorElevation, double gradientRange)
{
return; // No lookup table necessary
}
}
}
3 changes: 2 additions & 1 deletion SandWorm/Utilities/Structs.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ public enum ColorPalettes
Europe,
Greyscale,
Ocean,
Rainbow
Turbo,
Viridis
}
}
}

0 comments on commit 9801a79

Please sign in to comment.