mirror of
https://github.com/jiawanlong/Cesium-Examples.git
synced 2025-07-04 15:17:36 +00:00
308 lines
7.1 KiB
JavaScript
308 lines
7.1 KiB
JavaScript
/*
|
|
RainbowVis-JS
|
|
Released under Eclipse Public License - v 1.0
|
|
*/
|
|
|
|
function Rainbow()
|
|
{
|
|
"use strict";
|
|
var gradients = null;
|
|
var minNum = 0;
|
|
var maxNum = 100;
|
|
var colours = ['ff0000', 'ffff00', '00ff00', '0000ff'];
|
|
setColours(colours);
|
|
|
|
function setColours (spectrum)
|
|
{
|
|
if (spectrum.length < 2) {
|
|
throw new Error('Rainbow must have two or more colours.');
|
|
} else {
|
|
var increment = (maxNum - minNum)/(spectrum.length - 1);
|
|
var firstGradient = new ColourGradient();
|
|
firstGradient.setGradient(spectrum[0], spectrum[1]);
|
|
firstGradient.setNumberRange(minNum, minNum + increment);
|
|
gradients = [ firstGradient ];
|
|
|
|
for (var i = 1; i < spectrum.length - 1; i++) {
|
|
var colourGradient = new ColourGradient();
|
|
colourGradient.setGradient(spectrum[i], spectrum[i + 1]);
|
|
colourGradient.setNumberRange(minNum + increment * i, minNum + increment * (i + 1));
|
|
gradients[i] = colourGradient;
|
|
}
|
|
|
|
colours = spectrum;
|
|
}
|
|
}
|
|
|
|
this.setSpectrum = function ()
|
|
{
|
|
setColours(arguments);
|
|
return this;
|
|
}
|
|
|
|
this.setSpectrumByArray = function (array)
|
|
{
|
|
setColours(array);
|
|
return this;
|
|
}
|
|
|
|
this.colourAt = function (number)
|
|
{
|
|
if (isNaN(number)) {
|
|
throw new TypeError(number + ' is not a number');
|
|
} else if (gradients.length === 1) {
|
|
return gradients[0].colourAt(number);
|
|
} else {
|
|
var segment = (maxNum - minNum)/(gradients.length);
|
|
var index = Math.min(Math.floor((Math.max(number, minNum) - minNum)/segment), gradients.length - 1);
|
|
return gradients[index].colourAt(number);
|
|
}
|
|
}
|
|
|
|
this.colorAt = this.colourAt;
|
|
|
|
this.setNumberRange = function (minNumber, maxNumber)
|
|
{
|
|
if (maxNumber > minNumber) {
|
|
minNum = minNumber;
|
|
maxNum = maxNumber;
|
|
setColours(colours);
|
|
} else {
|
|
throw new RangeError('maxNumber (' + maxNumber + ') is not greater than minNumber (' + minNumber + ')');
|
|
}
|
|
return this;
|
|
}
|
|
}
|
|
|
|
function ColourGradient()
|
|
{
|
|
"use strict";
|
|
var startColour = 'ff0000';
|
|
var endColour = '0000ff';
|
|
var minNum = 0;
|
|
var maxNum = 100;
|
|
|
|
this.setGradient = function (colourStart, colourEnd)
|
|
{
|
|
startColour = getHexColour(colourStart);
|
|
endColour = getHexColour(colourEnd);
|
|
}
|
|
|
|
this.setNumberRange = function (minNumber, maxNumber)
|
|
{
|
|
if (maxNumber > minNumber) {
|
|
minNum = minNumber;
|
|
maxNum = maxNumber;
|
|
} else {
|
|
throw new RangeError('maxNumber (' + maxNumber + ') is not greater than minNumber (' + minNumber + ')');
|
|
}
|
|
}
|
|
|
|
this.colourAt = function (number)
|
|
{
|
|
return calcHex(number, startColour.substring(0,2), endColour.substring(0,2))
|
|
+ calcHex(number, startColour.substring(2,4), endColour.substring(2,4))
|
|
+ calcHex(number, startColour.substring(4,6), endColour.substring(4,6));
|
|
}
|
|
|
|
function calcHex(number, channelStart_Base16, channelEnd_Base16)
|
|
{
|
|
var num = number;
|
|
if (num < minNum) {
|
|
num = minNum;
|
|
}
|
|
if (num > maxNum) {
|
|
num = maxNum;
|
|
}
|
|
var numRange = maxNum - minNum;
|
|
var cStart_Base10 = parseInt(channelStart_Base16, 16);
|
|
var cEnd_Base10 = parseInt(channelEnd_Base16, 16);
|
|
var cPerUnit = (cEnd_Base10 - cStart_Base10)/numRange;
|
|
var c_Base10 = Math.round(cPerUnit * (num - minNum) + cStart_Base10);
|
|
return formatHex(c_Base10.toString(16));
|
|
}
|
|
|
|
function formatHex(hex)
|
|
{
|
|
if (hex.length === 1) {
|
|
return '0' + hex;
|
|
} else {
|
|
return hex;
|
|
}
|
|
}
|
|
|
|
function isHexColour(string)
|
|
{
|
|
var regex = /^#?[0-9a-fA-F]{6}$/i;
|
|
return regex.test(string);
|
|
}
|
|
|
|
function getHexColour(string)
|
|
{
|
|
if (isHexColour(string)) {
|
|
return string.substring(string.length - 6, string.length);
|
|
} else {
|
|
var name = string.toLowerCase();
|
|
if (colourNames.hasOwnProperty(name)) {
|
|
return colourNames[name];
|
|
}
|
|
throw new Error(string + ' is not a valid colour.');
|
|
}
|
|
}
|
|
|
|
// Extended list of CSS colornames s taken from
|
|
// http://www.w3.org/TR/css3-color/#svg-color
|
|
var colourNames = {
|
|
aliceblue: "F0F8FF",
|
|
antiquewhite: "FAEBD7",
|
|
aqua: "00FFFF",
|
|
aquamarine: "7FFFD4",
|
|
azure: "F0FFFF",
|
|
beige: "F5F5DC",
|
|
bisque: "FFE4C4",
|
|
black: "000000",
|
|
blanchedalmond: "FFEBCD",
|
|
blue: "0000FF",
|
|
blueviolet: "8A2BE2",
|
|
brown: "A52A2A",
|
|
burlywood: "DEB887",
|
|
cadetblue: "5F9EA0",
|
|
chartreuse: "7FFF00",
|
|
chocolate: "D2691E",
|
|
coral: "FF7F50",
|
|
cornflowerblue: "6495ED",
|
|
cornsilk: "FFF8DC",
|
|
crimson: "DC143C",
|
|
cyan: "00FFFF",
|
|
darkblue: "00008B",
|
|
darkcyan: "008B8B",
|
|
darkgoldenrod: "B8860B",
|
|
darkgray: "A9A9A9",
|
|
darkgreen: "006400",
|
|
darkgrey: "A9A9A9",
|
|
darkkhaki: "BDB76B",
|
|
darkmagenta: "8B008B",
|
|
darkolivegreen: "556B2F",
|
|
darkorange: "FF8C00",
|
|
darkorchid: "9932CC",
|
|
darkred: "8B0000",
|
|
darksalmon: "E9967A",
|
|
darkseagreen: "8FBC8F",
|
|
darkslateblue: "483D8B",
|
|
darkslategray: "2F4F4F",
|
|
darkslategrey: "2F4F4F",
|
|
darkturquoise: "00CED1",
|
|
darkviolet: "9400D3",
|
|
deeppink: "FF1493",
|
|
deepskyblue: "00BFFF",
|
|
dimgray: "696969",
|
|
dimgrey: "696969",
|
|
dodgerblue: "1E90FF",
|
|
firebrick: "B22222",
|
|
floralwhite: "FFFAF0",
|
|
forestgreen: "228B22",
|
|
fuchsia: "FF00FF",
|
|
gainsboro: "DCDCDC",
|
|
ghostwhite: "F8F8FF",
|
|
gold: "FFD700",
|
|
goldenrod: "DAA520",
|
|
gray: "808080",
|
|
green: "008000",
|
|
greenyellow: "ADFF2F",
|
|
grey: "808080",
|
|
honeydew: "F0FFF0",
|
|
hotpink: "FF69B4",
|
|
indianred: "CD5C5C",
|
|
indigo: "4B0082",
|
|
ivory: "FFFFF0",
|
|
khaki: "F0E68C",
|
|
lavender: "E6E6FA",
|
|
lavenderblush: "FFF0F5",
|
|
lawngreen: "7CFC00",
|
|
lemonchiffon: "FFFACD",
|
|
lightblue: "ADD8E6",
|
|
lightcoral: "F08080",
|
|
lightcyan: "E0FFFF",
|
|
lightgoldenrodyellow: "FAFAD2",
|
|
lightgray: "D3D3D3",
|
|
lightgreen: "90EE90",
|
|
lightgrey: "D3D3D3",
|
|
lightpink: "FFB6C1",
|
|
lightsalmon: "FFA07A",
|
|
lightseagreen: "20B2AA",
|
|
lightskyblue: "87CEFA",
|
|
lightslategray: "778899",
|
|
lightslategrey: "778899",
|
|
lightsteelblue: "B0C4DE",
|
|
lightyellow: "FFFFE0",
|
|
lime: "00FF00",
|
|
limegreen: "32CD32",
|
|
linen: "FAF0E6",
|
|
magenta: "FF00FF",
|
|
maroon: "800000",
|
|
mediumaquamarine: "66CDAA",
|
|
mediumblue: "0000CD",
|
|
mediumorchid: "BA55D3",
|
|
mediumpurple: "9370DB",
|
|
mediumseagreen: "3CB371",
|
|
mediumslateblue: "7B68EE",
|
|
mediumspringgreen: "00FA9A",
|
|
mediumturquoise: "48D1CC",
|
|
mediumvioletred: "C71585",
|
|
midnightblue: "191970",
|
|
mintcream: "F5FFFA",
|
|
mistyrose: "FFE4E1",
|
|
moccasin: "FFE4B5",
|
|
navajowhite: "FFDEAD",
|
|
navy: "000080",
|
|
oldlace: "FDF5E6",
|
|
olive: "808000",
|
|
olivedrab: "6B8E23",
|
|
orange: "FFA500",
|
|
orangered: "FF4500",
|
|
orchid: "DA70D6",
|
|
palegoldenrod: "EEE8AA",
|
|
palegreen: "98FB98",
|
|
paleturquoise: "AFEEEE",
|
|
palevioletred: "DB7093",
|
|
papayawhip: "FFEFD5",
|
|
peachpuff: "FFDAB9",
|
|
peru: "CD853F",
|
|
pink: "FFC0CB",
|
|
plum: "DDA0DD",
|
|
powderblue: "B0E0E6",
|
|
purple: "800080",
|
|
red: "FF0000",
|
|
rosybrown: "BC8F8F",
|
|
royalblue: "4169E1",
|
|
saddlebrown: "8B4513",
|
|
salmon: "FA8072",
|
|
sandybrown: "F4A460",
|
|
seagreen: "2E8B57",
|
|
seashell: "FFF5EE",
|
|
sienna: "A0522D",
|
|
silver: "C0C0C0",
|
|
skyblue: "87CEEB",
|
|
slateblue: "6A5ACD",
|
|
slategray: "708090",
|
|
slategrey: "708090",
|
|
snow: "FFFAFA",
|
|
springgreen: "00FF7F",
|
|
steelblue: "4682B4",
|
|
tan: "D2B48C",
|
|
teal: "008080",
|
|
thistle: "D8BFD8",
|
|
tomato: "FF6347",
|
|
turquoise: "40E0D0",
|
|
violet: "EE82EE",
|
|
wheat: "F5DEB3",
|
|
white: "FFFFFF",
|
|
whitesmoke: "F5F5F5",
|
|
yellow: "FFFF00",
|
|
yellowgreen: "9ACD32"
|
|
}
|
|
}
|
|
|
|
if (typeof module !== 'undefined') {
|
|
module.exports = Rainbow;
|
|
} |