瀏覽代碼

Plasma colormap

Former-commit-id: c9ec6bd0c20ed1b3c037217f8341acf814c7de6f
Joe Graus 7 年之前
父節點
當前提交
6cf173d75b
共有 2 個文件被更改,包括 422 次插入0 次删除
  1. 361 0
      include/igl/plasma.cpp
  2. 61 0
      include/igl/plasma.h

+ 361 - 0
include/igl/plasma.cpp

@@ -0,0 +1,361 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+//
+// Copyright (C) 2017 Joe Graus <jgraus@gmu.edu>, Alec Jacobson <alecjacobson@gmail.com>
+//
+// This Source Code Form is subject to the terms of the Mozilla Public License
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can
+// obtain one at http://mozilla.org/MPL/2.0/.
+#include "plasma.h"
+#include "colon.h"
+
+// One of the new matplotlib colormaps by Nathaniel J.Smith, Stefan van der Walt, and (in the case of viridis) Eric Firing.
+// Released under the CC0 license / public domain dedication
+static const unsigned int pal = 256;
+
+static float plasma_cm[pal][3] = {
+	{ 0.050383, 0.029803, 0.527975 },
+	{ 0.063536, 0.028426, 0.533124 },
+	{ 0.075353, 0.027206, 0.538007 },
+	{ 0.086222, 0.026125, 0.542658 },
+	{ 0.096379, 0.025165, 0.547103 },
+	{ 0.105980, 0.024309, 0.551368 },
+	{ 0.115124, 0.023556, 0.555468 },
+	{ 0.123903, 0.022878, 0.559423 },
+	{ 0.132381, 0.022258, 0.563250 },
+	{ 0.140603, 0.021687, 0.566959 },
+	{ 0.148607, 0.021154, 0.570562 },
+	{ 0.156421, 0.020651, 0.574065 },
+	{ 0.164070, 0.020171, 0.577478 },
+	{ 0.171574, 0.019706, 0.580806 },
+	{ 0.178950, 0.019252, 0.584054 },
+	{ 0.186213, 0.018803, 0.587228 },
+	{ 0.193374, 0.018354, 0.590330 },
+	{ 0.200445, 0.017902, 0.593364 },
+	{ 0.207435, 0.017442, 0.596333 },
+	{ 0.214350, 0.016973, 0.599239 },
+	{ 0.221197, 0.016497, 0.602083 },
+	{ 0.227983, 0.016007, 0.604867 },
+	{ 0.234715, 0.015502, 0.607592 },
+	{ 0.241396, 0.014979, 0.610259 },
+	{ 0.248032, 0.014439, 0.612868 },
+	{ 0.254627, 0.013882, 0.615419 },
+	{ 0.261183, 0.013308, 0.617911 },
+	{ 0.267703, 0.012716, 0.620346 },
+	{ 0.274191, 0.012109, 0.622722 },
+	{ 0.280648, 0.011488, 0.625038 },
+	{ 0.287076, 0.010855, 0.627295 },
+	{ 0.293478, 0.010213, 0.629490 },
+	{ 0.299855, 0.009561, 0.631624 },
+	{ 0.306210, 0.008902, 0.633694 },
+	{ 0.312543, 0.008239, 0.635700 },
+	{ 0.318856, 0.007576, 0.637640 },
+	{ 0.325150, 0.006915, 0.639512 },
+	{ 0.331426, 0.006261, 0.641316 },
+	{ 0.337683, 0.005618, 0.643049 },
+	{ 0.343925, 0.004991, 0.644710 },
+	{ 0.350150, 0.004382, 0.646298 },
+	{ 0.356359, 0.003798, 0.647810 },
+	{ 0.362553, 0.003243, 0.649245 },
+	{ 0.368733, 0.002724, 0.650601 },
+	{ 0.374897, 0.002245, 0.651876 },
+	{ 0.381047, 0.001814, 0.653068 },
+	{ 0.387183, 0.001434, 0.654177 },
+	{ 0.393304, 0.001114, 0.655199 },
+	{ 0.399411, 0.000859, 0.656133 },
+	{ 0.405503, 0.000678, 0.656977 },
+	{ 0.411580, 0.000577, 0.657730 },
+	{ 0.417642, 0.000564, 0.658390 },
+	{ 0.423689, 0.000646, 0.658956 },
+	{ 0.429719, 0.000831, 0.659425 },
+	{ 0.435734, 0.001127, 0.659797 },
+	{ 0.441732, 0.001540, 0.660069 },
+	{ 0.447714, 0.002080, 0.660240 },
+	{ 0.453677, 0.002755, 0.660310 },
+	{ 0.459623, 0.003574, 0.660277 },
+	{ 0.465550, 0.004545, 0.660139 },
+	{ 0.471457, 0.005678, 0.659897 },
+	{ 0.477344, 0.006980, 0.659549 },
+	{ 0.483210, 0.008460, 0.659095 },
+	{ 0.489055, 0.010127, 0.658534 },
+	{ 0.494877, 0.011990, 0.657865 },
+	{ 0.500678, 0.014055, 0.657088 },
+	{ 0.506454, 0.016333, 0.656202 },
+	{ 0.512206, 0.018833, 0.655209 },
+	{ 0.517933, 0.021563, 0.654109 },
+	{ 0.523633, 0.024532, 0.652901 },
+	{ 0.529306, 0.027747, 0.651586 },
+	{ 0.534952, 0.031217, 0.650165 },
+	{ 0.540570, 0.034950, 0.648640 },
+	{ 0.546157, 0.038954, 0.647010 },
+	{ 0.551715, 0.043136, 0.645277 },
+	{ 0.557243, 0.047331, 0.643443 },
+	{ 0.562738, 0.051545, 0.641509 },
+	{ 0.568201, 0.055778, 0.639477 },
+	{ 0.573632, 0.060028, 0.637349 },
+	{ 0.579029, 0.064296, 0.635126 },
+	{ 0.584391, 0.068579, 0.632812 },
+	{ 0.589719, 0.072878, 0.630408 },
+	{ 0.595011, 0.077190, 0.627917 },
+	{ 0.600266, 0.081516, 0.625342 },
+	{ 0.605485, 0.085854, 0.622686 },
+	{ 0.610667, 0.090204, 0.619951 },
+	{ 0.615812, 0.094564, 0.617140 },
+	{ 0.620919, 0.098934, 0.614257 },
+	{ 0.625987, 0.103312, 0.611305 },
+	{ 0.631017, 0.107699, 0.608287 },
+	{ 0.636008, 0.112092, 0.605205 },
+	{ 0.640959, 0.116492, 0.602065 },
+	{ 0.645872, 0.120898, 0.598867 },
+	{ 0.650746, 0.125309, 0.595617 },
+	{ 0.655580, 0.129725, 0.592317 },
+	{ 0.660374, 0.134144, 0.588971 },
+	{ 0.665129, 0.138566, 0.585582 },
+	{ 0.669845, 0.142992, 0.582154 },
+	{ 0.674522, 0.147419, 0.578688 },
+	{ 0.679160, 0.151848, 0.575189 },
+	{ 0.683758, 0.156278, 0.571660 },
+	{ 0.688318, 0.160709, 0.568103 },
+	{ 0.692840, 0.165141, 0.564522 },
+	{ 0.697324, 0.169573, 0.560919 },
+	{ 0.701769, 0.174005, 0.557296 },
+	{ 0.706178, 0.178437, 0.553657 },
+	{ 0.710549, 0.182868, 0.550004 },
+	{ 0.714883, 0.187299, 0.546338 },
+	{ 0.719181, 0.191729, 0.542663 },
+	{ 0.723444, 0.196158, 0.538981 },
+	{ 0.727670, 0.200586, 0.535293 },
+	{ 0.731862, 0.205013, 0.531601 },
+	{ 0.736019, 0.209439, 0.527908 },
+	{ 0.740143, 0.213864, 0.524216 },
+	{ 0.744232, 0.218288, 0.520524 },
+	{ 0.748289, 0.222711, 0.516834 },
+	{ 0.752312, 0.227133, 0.513149 },
+	{ 0.756304, 0.231555, 0.509468 },
+	{ 0.760264, 0.235976, 0.505794 },
+	{ 0.764193, 0.240396, 0.502126 },
+	{ 0.768090, 0.244817, 0.498465 },
+	{ 0.771958, 0.249237, 0.494813 },
+	{ 0.775796, 0.253658, 0.491171 },
+	{ 0.779604, 0.258078, 0.487539 },
+	{ 0.783383, 0.262500, 0.483918 },
+	{ 0.787133, 0.266922, 0.480307 },
+	{ 0.790855, 0.271345, 0.476706 },
+	{ 0.794549, 0.275770, 0.473117 },
+	{ 0.798216, 0.280197, 0.469538 },
+	{ 0.801855, 0.284626, 0.465971 },
+	{ 0.805467, 0.289057, 0.462415 },
+	{ 0.809052, 0.293491, 0.458870 },
+	{ 0.812612, 0.297928, 0.455338 },
+	{ 0.816144, 0.302368, 0.451816 },
+	{ 0.819651, 0.306812, 0.448306 },
+	{ 0.823132, 0.311261, 0.444806 },
+	{ 0.826588, 0.315714, 0.441316 },
+	{ 0.830018, 0.320172, 0.437836 },
+	{ 0.833422, 0.324635, 0.434366 },
+	{ 0.836801, 0.329105, 0.430905 },
+	{ 0.840155, 0.333580, 0.427455 },
+	{ 0.843484, 0.338062, 0.424013 },
+	{ 0.846788, 0.342551, 0.420579 },
+	{ 0.850066, 0.347048, 0.417153 },
+	{ 0.853319, 0.351553, 0.413734 },
+	{ 0.856547, 0.356066, 0.410322 },
+	{ 0.859750, 0.360588, 0.406917 },
+	{ 0.862927, 0.365119, 0.403519 },
+	{ 0.866078, 0.369660, 0.400126 },
+	{ 0.869203, 0.374212, 0.396738 },
+	{ 0.872303, 0.378774, 0.393355 },
+	{ 0.875376, 0.383347, 0.389976 },
+	{ 0.878423, 0.387932, 0.386600 },
+	{ 0.881443, 0.392529, 0.383229 },
+	{ 0.884436, 0.397139, 0.379860 },
+	{ 0.887402, 0.401762, 0.376494 },
+	{ 0.890340, 0.406398, 0.373130 },
+	{ 0.893250, 0.411048, 0.369768 },
+	{ 0.896131, 0.415712, 0.366407 },
+	{ 0.898984, 0.420392, 0.363047 },
+	{ 0.901807, 0.425087, 0.359688 },
+	{ 0.904601, 0.429797, 0.356329 },
+	{ 0.907365, 0.434524, 0.352970 },
+	{ 0.910098, 0.439268, 0.349610 },
+	{ 0.912800, 0.444029, 0.346251 },
+	{ 0.915471, 0.448807, 0.342890 },
+	{ 0.918109, 0.453603, 0.339529 },
+	{ 0.920714, 0.458417, 0.336166 },
+	{ 0.923287, 0.463251, 0.332801 },
+	{ 0.925825, 0.468103, 0.329435 },
+	{ 0.928329, 0.472975, 0.326067 },
+	{ 0.930798, 0.477867, 0.322697 },
+	{ 0.933232, 0.482780, 0.319325 },
+	{ 0.935630, 0.487712, 0.315952 },
+	{ 0.937990, 0.492667, 0.312575 },
+	{ 0.940313, 0.497642, 0.309197 },
+	{ 0.942598, 0.502639, 0.305816 },
+	{ 0.944844, 0.507658, 0.302433 },
+	{ 0.947051, 0.512699, 0.299049 },
+	{ 0.949217, 0.517763, 0.295662 },
+	{ 0.951344, 0.522850, 0.292275 },
+	{ 0.953428, 0.527960, 0.288883 },
+	{ 0.955470, 0.533093, 0.285490 },
+	{ 0.957469, 0.538250, 0.282096 },
+	{ 0.959424, 0.543431, 0.278701 },
+	{ 0.961336, 0.548636, 0.275305 },
+	{ 0.963203, 0.553865, 0.271909 },
+	{ 0.965024, 0.559118, 0.268513 },
+	{ 0.966798, 0.564396, 0.265118 },
+	{ 0.968526, 0.569700, 0.261721 },
+	{ 0.970205, 0.575028, 0.258325 },
+	{ 0.971835, 0.580382, 0.254931 },
+	{ 0.973416, 0.585761, 0.251540 },
+	{ 0.974947, 0.591165, 0.248151 },
+	{ 0.976428, 0.596595, 0.244767 },
+	{ 0.977856, 0.602051, 0.241387 },
+	{ 0.979233, 0.607532, 0.238013 },
+	{ 0.980556, 0.613039, 0.234646 },
+	{ 0.981826, 0.618572, 0.231287 },
+	{ 0.983041, 0.624131, 0.227937 },
+	{ 0.984199, 0.629718, 0.224595 },
+	{ 0.985301, 0.635330, 0.221265 },
+	{ 0.986345, 0.640969, 0.217948 },
+	{ 0.987332, 0.646633, 0.214648 },
+	{ 0.988260, 0.652325, 0.211364 },
+	{ 0.989128, 0.658043, 0.208100 },
+	{ 0.989935, 0.663787, 0.204859 },
+	{ 0.990681, 0.669558, 0.201642 },
+	{ 0.991365, 0.675355, 0.198453 },
+	{ 0.991985, 0.681179, 0.195295 },
+	{ 0.992541, 0.687030, 0.192170 },
+	{ 0.993032, 0.692907, 0.189084 },
+	{ 0.993456, 0.698810, 0.186041 },
+	{ 0.993814, 0.704741, 0.183043 },
+	{ 0.994103, 0.710698, 0.180097 },
+	{ 0.994324, 0.716681, 0.177208 },
+	{ 0.994474, 0.722691, 0.174381 },
+	{ 0.994553, 0.728728, 0.171622 },
+	{ 0.994561, 0.734791, 0.168938 },
+	{ 0.994495, 0.740880, 0.166335 },
+	{ 0.994355, 0.746995, 0.163821 },
+	{ 0.994141, 0.753137, 0.161404 },
+	{ 0.993851, 0.759304, 0.159092 },
+	{ 0.993482, 0.765499, 0.156891 },
+	{ 0.993033, 0.771720, 0.154808 },
+	{ 0.992505, 0.777967, 0.152855 },
+	{ 0.991897, 0.784239, 0.151042 },
+	{ 0.991209, 0.790537, 0.149377 },
+	{ 0.990439, 0.796859, 0.147870 },
+	{ 0.989587, 0.803205, 0.146529 },
+	{ 0.988648, 0.809579, 0.145357 },
+	{ 0.987621, 0.815978, 0.144363 },
+	{ 0.986509, 0.822401, 0.143557 },
+	{ 0.985314, 0.828846, 0.142945 },
+	{ 0.984031, 0.835315, 0.142528 },
+	{ 0.982653, 0.841812, 0.142303 },
+	{ 0.981190, 0.848329, 0.142279 },
+	{ 0.979644, 0.854866, 0.142453 },
+	{ 0.977995, 0.861432, 0.142808 },
+	{ 0.976265, 0.868016, 0.143351 },
+	{ 0.974443, 0.874622, 0.144061 },
+	{ 0.972530, 0.881250, 0.144923 },
+	{ 0.970533, 0.887896, 0.145919 },
+	{ 0.968443, 0.894564, 0.147014 },
+	{ 0.966271, 0.901249, 0.148180 },
+	{ 0.964021, 0.907950, 0.149370 },
+	{ 0.961681, 0.914672, 0.150520 },
+	{ 0.959276, 0.921407, 0.151566 },
+	{ 0.956808, 0.928152, 0.152409 },
+	{ 0.954287, 0.934908, 0.152921 },
+	{ 0.951726, 0.941671, 0.152925 },
+	{ 0.949151, 0.948435, 0.152178 },
+	{ 0.946602, 0.955190, 0.150328 },
+	{ 0.944152, 0.961916, 0.146861 },
+	{ 0.941896, 0.968590, 0.140956 },
+	{ 0.940015, 0.975158, 0.131326 }
+};
+
+template <typename T>
+static float hue(float delta, T r, T g, T b) {
+	float h = 0.0f;
+
+	if (delta != 0.0f) {
+		if (r > g && r > b) {
+			h = 60.0f * std::fmod(g - b / delta, 6.0);
+		} else if (g > b) {
+			h = 60.0f * ((b - r / delta) + 2.0);
+		} else {
+			h = 60.0f * ((r - g / delta) + 4.0);
+		}
+	}
+
+	return h;
+}
+
+template <typename T>
+IGL_INLINE void igl::plasma(const T x, T * rgb)
+{
+  return plasma(x,rgb[0],rgb[1],rgb[2]);
+}
+
+template <typename T>
+IGL_INLINE void igl::plasma(const T x_in, T & r, T & g, T & b)
+{
+	T x_in_clamped = static_cast<T>(std::max(0.0, std::min(1.0, x_in)));
+
+	// simple rgb lerp from palette 
+	unsigned int least = std::floor(x_in_clamped * static_cast<T>(pal - 1));
+	unsigned int most = std::ceil(x_in_clamped * static_cast<T>(pal - 1));
+
+	T _r[2] = { plasma_cm[least][0], plasma_cm[most][0] };
+	T _g[2] = { plasma_cm[least][1], plasma_cm[most][1] };
+	T _b[2] = { plasma_cm[least][2], plasma_cm[most][2] };
+
+	float t = std::max(0.0, std::min(1.0, fmod(x_in_clamped * static_cast<T>(pal), 1.0f)));
+
+	r = std::max(0.0, std::min(1.0, (1.0f - t) * _r[0] + t * _r[1]));
+	g = std::max(0.0, std::min(1.0, (1.0f - t) * _g[0] + t * _g[1]));
+	b = std::max(0.0, std::min(1.0, (1.0f - t) * _b[0] + t * _b[1]));
+}
+
+template <typename DerivedZ, typename DerivedC>
+IGL_INLINE void igl::plasma(
+  const Eigen::PlainObjectBase<DerivedZ> & Z,
+  const bool normalize,
+  Eigen::PlainObjectBase<DerivedC> & C)
+{
+  const double min_z = (normalize ? Z.minCoeff()) :  0;
+  const double max_z = (normalize ? Z.maxCoeff()) : -1;
+  return plasma(Z, min_z, max_z, C);
+}
+
+template <typename DerivedZ, typename DerivedC>
+IGL_INLINE void igl::plasma(
+  const Eigen::PlainObjectBase<DerivedZ> & Z,
+  const double min_z,
+  const double max_z,
+  Eigen::PlainObjectBase<DerivedC> & C)
+{
+  C.resize(Z.rows(),3);
+  double denom = (max_z - min_z);
+  denom = (denom == 0) ? 1 : denom;
+  for(int r = 0; r < Z.rows(); ++r) {
+    plasma(
+      (typename DerivedC::Scalar)((-min_z + Z(r,0)) / denom),
+      C(r,0),
+      C(r,1),
+      C(r,2));
+  }
+}
+
+#ifdef IGL_STATIC_LIBRARY
+// Explicit template instantiation
+// generated by autoexplicit.sh
+template void igl::plasma<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+template void igl::plasma<double>(double, double*);
+template void igl::plasma<double>(double, double&, double&, double&);
+template void igl::plasma<float>(float, float*);
+template void igl::plasma<Eigen::Array<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Array<double, -1, 1, 0, -1, 1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+template void igl::plasma<Eigen::Matrix<int, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<int, -1, 1, 0, -1, 1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+template void igl::plasma<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, bool, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+template void igl::plasma<float>(float, float&, float&, float&);
+template void igl::plasma<Eigen::Matrix<float, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<float, -1, 1, 0, -1, 1> > const&, double, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+template void igl::plasma<Eigen::Matrix<double, -1, 1, 0, -1, 1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, 1, 0, -1, 1> > const&, double, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+template void igl::plasma<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<double, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, double, double, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&);
+#endif

+ 61 - 0
include/igl/plasma.h

@@ -0,0 +1,61 @@
+// This file is part of libigl, a simple c++ geometry processing library.
+// 
+// Copyright (C) 2017 Joe Graus <jgraus@gmu.edu>, Alec Jacobson <alecjacobson@gmail.com>
+// 
+// This Source Code Form is subject to the terms of the Mozilla Public License 
+// v. 2.0. If a copy of the MPL was not distributed with this file, You can 
+// obtain one at http://mozilla.org/MPL/2.0/.
+
+#ifndef IGL_PLASMA_H
+#define IGL_PLASMA_H
+#include "igl_inline.h"
+
+#include <Eigen/Dense>
+
+namespace igl {
+  // Plasma colormap -- a perceptually uniform sequential colormap
+  //
+  // Inputs:
+  //   m  number of colors 
+  // Outputs:
+  //   J  m by list of RGB colors between 0 and 1
+  //
+  // Wrapper for directly computing [r,g,b] values for a given factor f between
+  // 0 and 1
+  //
+  // Inputs:
+  //   f  factor determining color value as if 0 was min and 1 was max
+  // Outputs:
+  //   r  red value
+  //   g  green value
+  //   b  blue value
+  template <typename T>
+  IGL_INLINE void plasma(const T f, T * rgb);
+  template <typename T>
+  IGL_INLINE void plasma(const T f, T & r, T & g, T & b);
+  // Inputs:
+  //   Z  #Z list of factors
+  //   normalize  whether to normalize Z to be tightly between [0,1]
+  // Outputs:
+  //   C  #C by 3 list of rgb colors
+  template <typename DerivedZ, typename DerivedC>
+  IGL_INLINE void plasma(
+    const Eigen::PlainObjectBase<DerivedZ> & Z,
+    const bool normalize,
+    Eigen::PlainObjectBase<DerivedC> & C);
+  // Inputs:
+  //   min_z  value at black
+  //   max_z  value at yellow
+  template <typename DerivedZ, typename DerivedC>
+  IGL_INLINE void plasma(
+    const Eigen::PlainObjectBase<DerivedZ> & Z,
+    const double min_Z,
+    const double max_Z,
+    Eigen::PlainObjectBase<DerivedC> & C);
+};
+
+#ifndef IGL_STATIC_LIBRARY
+#  include "plasma.cpp"
+#endif
+
+#endif