Comience por crear un mapa de ruido con las dimensiones (width + 1) x (height + 1)
que se utilizarán para desplazar la imagen original. Sugiero usar algún tipo de perlin noise para que el desplazamiento no sea aleatorio. Aquí hay un buen link sobre cómo generar ruido perlin.
Una vez que tenemos el ruido que podemos hacer algo como esto:
Image noisemap; //size is (width + 1) x (height + 1) gray scale values in [0 255] range
Image source; //source image
Image destination; //destination image
float displacementRadius = 10.0f; //Displacemnet amount in pixels
for (int y = 0; y < source.height(); ++y) {
for (int x = 0; x < source.width(); ++x) {
const float n0 = float(noise.getValue(x, y))/255.0f;
const float n1 = float(noise.getValue(x + 1, y))/255.0f;
const float n2 = float(noise.getValue(x, y + 1))/255.0f;
const int dx = int(floorf((n1 - n0) * displacementRadius + 0.5f));
const int dy = int(floorf((n2 - n0) * displacementRadius + 0.5f));
const int sx = std::min(std::max(x + dx, 0), source.width() - 1); //Clamp
const int sy = std::min(std::max(y + dy, 0), source.height() - 1); //Clamp
const Pixel& value = source.getValue(sx, sy);
destination.setValue(x, y, value);
}
}
Gracias Andreas. Esto es exactamente lo que estaba buscando. Gracias de nuevo – megha