Hi Filax!
Any News on TerraED pro? =)
Any News on TerraED pro? =)
double Interpolate (double fA, double fB, double fX) { return (fA * (1 - fX) + fB * fX); } double GetHeight (double fx, double fy) { if (fx < 0 || fx > WIDTH) return 0.0; // ERROR! if (fy < 0 || fy > HEIGHT) return 0.0; // ERROR! int x = (int) fx; int y = (int) fy; int x1 = x + 1; int y1 = y + 1; double dX = fx - (double) x; double dY = fy - (double) y; double fHeight1 = m_afHeightmap[x + y * WIDTH]; double fHeight2 = m_afHeightmap[x1 + y * WIDTH]; double fHeight3 = m_afHeightmap[x + y * WIDTH]; double fHeight4 = m_afHeightmap[x1 + y1 * WIDTH]; return Interpolate (Interpolate (fHeight1, fHeight2, dX), Interpolate (fHeight3, fHeight4, dX), dY); }
//------------------------------------------------------------ // // example // ------- // // (x0, h0, y0) (x1, h1, y0) // +---------------+ // | ./| // | . / | // | . / |dy // | . / | // | . / | // | . +-----+ ^ // | . dx | (1-dy) |d_hy =(1-dy)(h1 - h3) // +---------------+ v // (x0, h2, y1) (x1, h3, y1) // // <---> // d_hx = dx(h2-h3) // // // h = h3 + hx + hy // //------------------------------------------------------------ double GetHeight (double fx, double fy) { if (fx < 0 || fx > (WIDTH - 1)) return 0.0; // ERROR! if (fy < 0 || fy > (HEIGHT - 1)) return 0.0; // ERROR! int x0 = (int) fx; int y0 = (int) fy; int x1 = x0 + 1; int y1 = y0 + 1; double dX = (double) x1 - fx; double dY = fy - (double) y0; double h0 = g_afHeightMap[x0 + y0 * WIDTH]; double h1 = g_afHeightMap[x1 + y0 * WIDTH]; double h2 = g_afHeightMap[x0 + y1 * WIDTH]; double h3 = g_afHeightMap[x1 + y1 * WIDTH]; double h; // top left triangle // interpolate with origin at (x0), and going towards // x1 and x2 if (dx > dy) { h = h0 + (1 - dx) * (h1 - h0) + dy * (h2 - h0); } // bottom right triangle // interpolate with origin at (x3), and going towards // x2 and x1 else { h = h3 + dx * (h3 - h2) + (1 - dy) * (h1 - h3); } return h; }