See the previous post for the TerrainStruct.h header file. Somewhat redundant post but setup to compile on my linux compiler with the given gnu version that I am evidently using which for some odd reason is fussy around passing by values arrays (or something funny like this).
//*****************************BiCubicResample.cpp****************************************
#define __BicubicResample_CPP
#include <vector>
/*
double cubicInterpolate (std::vector<double> * p, double x) {
return (*p)[1] + 0.5 * x*((*p)[2] - (*p)[0] + x*(2.0*(*p)[0] - 5.0*(*p)[1] + 4.0*(*p)[2] - (*p)[3] + x*(3.0*((*p)[1] - (*p)[2]) + (*p)[3] - (*p)[0])));
}
*/
///*
double cubicInterpolate (std::vector<double> * p, double x) {
return (*p)[1] + .5f*x*(-1.0f*(*p)[0]+(*p)[2]) + x*x*((*p)[0] - 5.0f/2.0f * (*p)[1] +2.0f*(*p)[2] -.5f*(*p)[3]) + x*x*x*(-.5f*(*p)[0] + 1.5f*(*p)[1] - 1.5f*(*p)[2] +.5f*(*p)[3]);
}
//*/
//trying a forward differencing as opposed to central difference method. Same deal.
//
/*
double cubicInterpolate (std::vector<double> * p, double x) {
return (*p)[1] + x*(-1.0f*(*p)[0]+(*p)[1]) + x*x*(2.0f*(*p)[0] - 5.0f * (*p)[1] +4.0f*(*p)[2] -1.0f*(*p)[3]) + x*x*x*(-1.0f*(*p)[0] + 3.0f*(*p)[1] - 3.0f*(*p)[2] +1.0f*(*p)[3]);
}
*/
double bicubicInterpolate (std::vector<std::vector<double> > * p, double x, double y) {
std::vector<double> arr(4,0);
for (int i = 0; i < 4; i ++){
std::vector<double> v(4,0);
v[0] = (*p)[i][0]; v[1] = (*p)[i][1]; v[2] = (*p)[i][2]; v[3] = (*p)[i][3];
/*
arr[0] = cubicInterpolate(&((*p)[0]), y);
arr[1] = cubicInterpolate(&((*p)[1]), y);
arr[2] = cubicInterpolate(&((*p)[2]), y);
arr[3] = cubicInterpolate(&((*p)[3]), y);
*/
arr[i] = cubicInterpolate(&v,y);
}
return cubicInterpolate(&arr, x);
}
#endif
//**************************BuildBiCubicResample.cpp*****************************************
#ifndef __BuildBicubicResample_CPP
#define __BuildBicubicResample_CPP
#include "TerrainStruct.h"
#include "BicubicResample.cpp"
#include <vector>
terr::CPointsMap * BuildBicubicResampl( double size, double RSize, terr::CPointsMap * heightmap){
terr::CPointsMap * Rheightmap = new terr::CPointsMap();
for (int i = 0; i < RSize; i++){
for(int j = 0; j < RSize; j++){
double x = ((double) i) * (size-2.0f)/(RSize-1.0f);
double y = ((double) j) * (size-2.0f)/(RSize-1.0f);
int p1x = (int)x; int p1y = (int)y;
double locx = x -p1x; double locy = y-p1y;
int p2x = (int)x+1; int p2y = (int)y+1;
int p0x = (x <= 0 ? p1x : p1x-1); int p0y = (y <= 0 ? p1y : p1y-1);
int p3x = (x >= (size-2.0f) ? p2x : p2x+1); int p3y = (y >= (size-2.0f) ? p2y : p2y+1);
terr::Coordpair * p00 = new terr::Coordpair(p0x,p0y);
terr::Coordpair * p01 = new terr::Coordpair(p0x,p1y);
terr::Coordpair * p02 = new terr::Coordpair(p0x,p2y);
terr::Coordpair * p03 = new terr::Coordpair(p0x,p3y);
terr::Coordpair * p10 = new terr::Coordpair(p1x,p0y);
terr::Coordpair * p11 = new terr::Coordpair(p1x,p1y);
terr::Coordpair * p12 = new terr::Coordpair(p1x,p2y);
terr::Coordpair * p13 = new terr::Coordpair(p1x,p3y);
terr::Coordpair * p20 = new terr::Coordpair(p2x,p0y);
terr::Coordpair * p21 = new terr::Coordpair(p2x,p1y);
terr::Coordpair * p22 = new terr::Coordpair(p2x,p2y);
terr::Coordpair * p23 = new terr::Coordpair(p2x,p3y);
terr::Coordpair * p30 = new terr::Coordpair(p3x,p0y);
terr::Coordpair * p31 = new terr::Coordpair(p3x,p1y);
terr::Coordpair * p32 = new terr::Coordpair(p3x,p2y);
terr::Coordpair * p33 = new terr::Coordpair(p3x,p3y);
std::vector<double> ay(4,0);
std::vector<std::vector<double> > a(4,ay);
a[0][0] = (*heightmap)[(*p00)]; a[0][1] = (*heightmap)[(*p01)];
a[0][2] = (*heightmap)[(*p02)]; a[0][3] = (*heightmap)[(*p03)];
a[1][0] = (*heightmap)[(*p10)]; a[1][1] = (*heightmap)[(*p11)];
a[1][2] = (*heightmap)[(*p12)]; a[1][3] = (*heightmap)[(*p13)];
a[2][0] = (*heightmap)[(*p20)]; a[2][1] = (*heightmap)[(*p21)];
a[2][2] = (*heightmap)[(*p22)]; a[2][3] = (*heightmap)[(*p23)];
a[3][0] = (*heightmap)[(*p30)]; a[3][1] = (*heightmap)[(*p31)];
a[3][2] = (*heightmap)[(*p32)]; a[3][3] = (*heightmap)[(*p33)];
double height = bicubicInterpolate (&a, locx, locy); //slower matrix compute method
terr::Coordpair * coord = new terr::Coordpair(i,j);
(*Rheightmap)[(*coord)] = height;
}
}
return Rheightmap;
}
#endif
No comments:
Post a Comment