diff --git a/Graphics/Post.cpp b/Graphics/Post.cpp index e547f3934d23b2f6d686cc60900e87b2e8ae6edf..a1ee51162e9412b5a9488ee9853505973f418e5d 100644 --- a/Graphics/Post.cpp +++ b/Graphics/Post.cpp @@ -323,7 +323,9 @@ static void addScalarPoint(PView *p, double xyz[NMAX][3], double val[NMAX][9], if(opt->SaturateValues) saturate(1, val, vmin, vmax, i0); if(val[i0][0] >= vmin && val[i0][0] <= vmax){ - unsigned int col = opt->getColor(val[i0][0], vmin, vmax); + unsigned int col = opt->getColor(val[i0][0], vmin, vmax, false, + (opt->IntervalsType == PViewOptions::Discrete) ? + opt->NbIso : -1); SVector3 n = getPointNormal(p, val[i0][0]); p->va_points->add(&xyz[i0][0], &xyz[i0][1], &xyz[i0][2], &n, &col, 0, unique); } @@ -399,7 +401,7 @@ static void addScalarLine(PView *p, double xyz[NMAX][3], double val[NMAX][9], double x2[2], y2[2], z2[2], v2[2]; int nb = CutLine(x, y, z, v, min, max, x2, y2, z2, v2); if(nb == 2){ - unsigned color = opt->getColor(k, opt->NbIso); + unsigned int color = opt->getColor(k, opt->NbIso); unsigned int col[2] = {color, color}; SVector3 n[2]; getLineNormal(p, x2, y2, z2, v2, n, true); @@ -524,7 +526,7 @@ static void addScalarTriangle(PView *p, double xyz[NMAX][3], double val[NMAX][9] double x2[10], y2[10], z2[10], v2[10]; int nb = CutTriangle(x, y, z, v, min, max, x2, y2, z2, v2); if(nb >= 3){ - unsigned color = opt->getColor(k, opt->NbIso); + unsigned int color = opt->getColor(k, opt->NbIso); unsigned int col[3] = {color, color, color}; for(int j = 2; j < nb; j++){ double x3[3] = {x2[0], x2[j - 1], x2[j]}; @@ -868,7 +870,9 @@ static void addVectorElement(PView *p, int ient, int iele, int numNodes, for(int i = 0; i < numNodes; i++){ double v2 = ComputeScalarRep(numComp2, val2[i]); if(v2 >= opt->ExternalMin && v2 <= opt->ExternalMax){ - unsigned int color = opt->getColor(v2, opt->ExternalMin, opt->ExternalMax); + unsigned int color = opt->getColor(v2, opt->ExternalMin, opt->ExternalMax, false, + (opt->IntervalsType == PViewOptions::Discrete) ? + opt->NbIso : -1); unsigned int col[2] = {color, color}; double dxyz[3][2]; for(int j = 0; j < 3; j++){ @@ -899,7 +903,9 @@ static void addVectorElement(PView *p, int ient, int iele, int numNodes, double v2 = ComputeScalarRep(numComp2, d2); if(v2 >= opt->ExternalMin * (1. - 1.e-15) && v2 <= opt->ExternalMax * (1. + 1.e-15)){ - unsigned int color = opt->getColor(v2, opt->ExternalMin, opt->ExternalMax); + unsigned int color = opt->getColor(v2, opt->ExternalMin, opt->ExternalMax, false, + (opt->IntervalsType == PViewOptions::Discrete) ? + opt->NbIso : -1); unsigned int col[2] = {color, color}; double dxyz[3][2]; for(int i = 0; i < 3; i++){ diff --git a/Post/PViewOptions.cpp b/Post/PViewOptions.cpp index bd853f4419eec620844752f6e8ad31a8ca412761..cac0c95175a31d857f7490b00f52141dfb3bf7f5 100644 --- a/Post/PViewOptions.cpp +++ b/Post/PViewOptions.cpp @@ -46,6 +46,7 @@ double PViewOptions::getScaleValue(int iso, int numIso, double min, double max) return 0.; } +// return index between 0 and (numIso-1) int PViewOptions::getScaleIndex(double val, int numIso, double min, double max, bool forceLinear) { @@ -68,11 +69,23 @@ int PViewOptions::getScaleIndex(double val, int numIso, double min, double max, // val in [min, max] unsigned int PViewOptions::getColor(double val, double min, double max, - bool forceLinear) + bool forceLinear, int numColors) { if(CT.size == 1) return CT.table[0]; - int index = getScaleIndex(val, CT.size, min, max, forceLinear); - return CT.table[index]; + + if(numColors <= 0){ // use full colormap + int index = getScaleIndex(val, CT.size, min, max, forceLinear); + if(index < 0) index = 0; + else if(index > CT.size - 1) index = CT.size - 1; + return CT.table[index]; + } + else{ + // the maximum should belong to the last interval: so use + // numColors + 1 and correct afterwards + int index = getScaleIndex(val, numColors + 1, min, max, forceLinear); + if(index > numColors - 1) index = numColors - 1; + return getColor(index, numColors); + } } // i in [0, nb - 1] @@ -80,6 +93,8 @@ unsigned int PViewOptions::getColor(int i, int nb) { int index = (nb == 1) ? CT.size / 2 : (int)(i / (double)(nb - 1) * (CT.size - 1) + 0.5); + if(index < 0) index = 0; + else if(index > CT.size - 1) index = CT.size - 1; return CT.table[index]; } diff --git a/Post/PViewOptions.h b/Post/PViewOptions.h index 9f1225b1813cc9fe7ea30c5786aa319128953729..ce466e949e59f908b95ffc313ae01f60754ad654 100644 --- a/Post/PViewOptions.h +++ b/Post/PViewOptions.h @@ -102,7 +102,8 @@ class PViewOptions { int getScaleIndex(double val, int numIso, double min, double max, bool forceLinear=false); unsigned int getColor(int i, int nb); - unsigned int getColor(double val, double min, double max, bool forceLinear=false); + unsigned int getColor(double val, double min, double max, + bool forceLinear=false, int numColors=-1); bool skipElement(int numEdges); };