ultimatepp/uppsrc/ScatterDraw/Surf.cpp
koldo 64b288773b ScatterDraw: PLot responsiveness and 2D surfaces added.
git-svn-id: svn://ultimatepp.org/upp/trunk@12443 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2018-11-02 23:11:29 +00:00

67 lines
2.4 KiB
C++

#include "ScatterDraw.h"
ScatterDraw& ScatterDraw::AddSurf(DataSourceSurf &surf) {
this->surf = &surf;
if (IsNull(surfMinZ))
surfMinZ = surf.MinZ();
if (IsNull(surfMaxZ))
surfMaxZ = surf.MaxZ();
return *this;
}
inline static double Smooth01(double val) {
double val2 = val*val;
return 3*val2 - 2*val2*val;
}
inline static double Smooth01Left(double val) {return 2*Smooth01(val/2);}
inline static double Smooth01Right(double val) {return 2*(Smooth01(0.5 + val/2)-0.5);}
inline static double Filter01(double frac) {
if (frac >= 1)
return 1;
else if (frac < 0)
return 0;
return frac;
}
static Color InterpolateColor(double frac, const Color &from, const Color &to) {
return Color(int(from.GetR() + frac*(to.GetR() - from.GetR())),
int(from.GetG() + frac*(to.GetG() - from.GetG())),
int(from.GetB() + frac*(to.GetB() - from.GetB())));
}
Color GetRainbowColor(double frac, RAINBOW rainbow, int numScales) {
frac = Filter01(frac);
switch (rainbow) {
case BLUE_YELLOW_RED: frac = 1 - frac;
case RED_YELLOW_BLUE: return GetRainbowColor(frac, Color(255,0,0), Color(255,255,0), Color(0,0,255), numScales);
case GREEN_YELLOW_RED: frac = 1 - frac;
case RED_YELLOW_GREEN: return GetRainbowColor(frac, Color(255,0,0), Color(255,255,0), Color(0,255,0), numScales);
case WHITE_BLACK: frac = 1 - frac;
case BLACK_WHITE: return GetRainbowColor(frac, Color(0,0,0), Color(255,255,255), numScales);
case BLUE_WHITE_RED: frac = 1 - frac;
case RED_WHITE_BLUE: return GetRainbowColor(frac, Color(255,0,0), Color(255,255,255), Color(0,0,255), numScales);
}
return Null;
}
Color GetRainbowColor(double frac, const Color &from, const Color &to, int numScales) {
if (numScales > 0)
frac = (int(frac*numScales)/double(numScales))/(1 - 1/numScales);
frac = Filter01(frac);
return InterpolateColor(frac, from, to);
}
Color GetRainbowColor(double frac, const Color &col0, const Color &col1, const Color &col2, int numScales) {
if (IsNull(col2))
return GetRainbowColor(frac, col0, col1, numScales);
if (numScales > 0)
frac = int(frac*numScales)/double(numScales - 1);
frac = Filter01(frac);
if (frac < 0.5)
return InterpolateColor((numScales > 0) ? 2*frac : Smooth01Right(2*frac), col0, col1);
else
return InterpolateColor((numScales > 0) ? 2*(frac - 0.5) : Smooth01Left(2*(frac - 0.5)), col1, col2);
}