short RasterMapRaw::_GetFieldAtXY(unsigned int lx, unsigned int ly) { unsigned int ix = CombinedDivAndMod(lx); unsigned int iy = CombinedDivAndMod(ly); if ((ly>=(unsigned int)TerrainInfo.Rows) ||(lx>=(unsigned int)TerrainInfo.Columns)) { return TERRAIN_INVALID; } short *tm = TerrainMem+ly*TerrainInfo.Columns+lx; // perform piecewise linear interpolation int h1 = *tm; // (x,y) if (!ix && !iy) { return h1; } if (lx+1 >= (unsigned int)TerrainInfo.Columns) { return h1; } if (ly+1 >= (unsigned int)TerrainInfo.Rows) { return h1; } int h3 = tm[TerrainInfo.Columns+1]; // (x+1, y+1) if (ix>iy) { // lower triangle int h2 = tm[1]; // (x+1,y) return (short)(h1+((ix*(h2-h1)-iy*(h2-h3))>>8)); } else {
short RasterBuffer::GetInterpolated(unsigned lx, unsigned ly) const { // check x in range, and decompose fraction part const unsigned int ix = CombinedDivAndMod(lx); if (lx >= GetWidth()) return TERRAIN_INVALID; // check y in range, and decompose fraction part const unsigned int iy = CombinedDivAndMod(ly); if (ly >= GetHeight()) return TERRAIN_INVALID; return GetInterpolated(lx, ly, ix, iy); }