float getRedNoiseValue(rednoisemodel_t* model, float mjd,int real){ int i = (int)((mjd-model->start)/model->tres); float mu = ((mjd-model->start)/model->tres) - (float)i; i+=real*model->npt; return CatmullRomInterpolate(model->data[i-1],model->data[i],model->data[i+1],model->data[i+2],mu); }
cOneParameter cMorph::CatmullRom(int const key, double const factor, bool const angular) { int k1, k2, k3, k4; if (key >= 1) k1 = key - 1; else k1 = key; if (key < dataSets.size()) k2 = key; else k2 = dataSets.size() - 1; if (key < dataSets.size() - 1) k3 = key + 1; else k3 = dataSets.size() - 1; if (key < dataSets.size() - 2) k4 = key + 2; else k4 = dataSets.size() - 1; cOneParameter interpolated = dataSets[key].parameter; cMultiVal val; switch (dataSets[key].parameter.GetValueType()) { case typeNull: case typeString: case typeBool: return None(key); case typeDouble: case typeInt: { double v1, v2, v3, v4; dataSets[k1].parameter.GetMultival(valueActual).Get(v1); dataSets[k2].parameter.GetMultival(valueActual).Get(v2); dataSets[k3].parameter.GetMultival(valueActual).Get(v3); dataSets[k4].parameter.GetMultival(valueActual).Get(v4); val.Store(CatmullRomInterpolate(factor, v1, v2, v3, v4, angular)); break; } case typeRgb: { sRGB v1, v2, v3, v4; dataSets[k1].parameter.GetMultival(valueActual).Get(v1); dataSets[k2].parameter.GetMultival(valueActual).Get(v2); dataSets[k3].parameter.GetMultival(valueActual).Get(v3); dataSets[k4].parameter.GetMultival(valueActual).Get(v4); val.Store(sRGB(CatmullRomInterpolate(factor, v1.R, v2.R, v3.R, v4.R, angular), CatmullRomInterpolate(factor, v1.G, v2.G, v3.G, v4.G, angular), CatmullRomInterpolate(factor, v1.B, v2.B, v3.B, v4.B, angular))); break; } case typeVector3: { CVector3 v1, v2, v3, v4; dataSets[k1].parameter.GetMultival(valueActual).Get(v1); dataSets[k2].parameter.GetMultival(valueActual).Get(v2); dataSets[k3].parameter.GetMultival(valueActual).Get(v3); dataSets[k4].parameter.GetMultival(valueActual).Get(v4); val.Store(CVector3(CatmullRomInterpolate(factor, v1.x, v2.x, v3.x, v4.x, angular), CatmullRomInterpolate(factor, v1.y, v2.y, v3.y, v4.y, angular), CatmullRomInterpolate(factor, v1.z, v2.z, v3.z, v4.z, angular))); break; } case typeVector4: { CVector4 v1, v2, v3, v4; dataSets[k1].parameter.GetMultival(valueActual).Get(v1); dataSets[k2].parameter.GetMultival(valueActual).Get(v2); dataSets[k3].parameter.GetMultival(valueActual).Get(v3); dataSets[k4].parameter.GetMultival(valueActual).Get(v4); val.Store(CVector4(CatmullRomInterpolate(factor, v1.x, v2.x, v3.x, v4.x, angular), CatmullRomInterpolate(factor, v1.y, v2.y, v3.y, v4.y, angular), CatmullRomInterpolate(factor, v1.z, v2.z, v3.z, v4.z, angular), CatmullRomInterpolate(factor, v1.w, v2.w, v3.w, v4.w, angular))); break; } case typeColorPalette: { cColorPalette v1, v2, v3, v4; cColorPalette out; dataSets[k1].parameter.GetMultival(valueActual).Get(v1); dataSets[k2].parameter.GetMultival(valueActual).Get(v2); dataSets[k3].parameter.GetMultival(valueActual).Get(v3); dataSets[k4].parameter.GetMultival(valueActual).Get(v4); for (int i = 0; i < v1.GetSize(); i++) { out.AppendColor(sRGB(CatmullRomInterpolate(factor, v1.GetColor(i).R, v2.GetColor(i).R, v3.GetColor(i).R, v4.GetColor(i).R, angular), CatmullRomInterpolate(factor, v1.GetColor(i).G, v2.GetColor(i).G, v3.GetColor(i).G, v4.GetColor(i).G, angular), CatmullRomInterpolate(factor, v1.GetColor(i).B, v2.GetColor(i).B, v3.GetColor(i).B, v4.GetColor(i).B, angular))); } val.Store(out); break; } } interpolated.SetMultival(val, valueActual); return interpolated; }