Rozpocznij od utworzenia mapy hałasu o wymiarach (width + 1) x (height + 1)
, która zostanie użyta do zastąpienia oryginalnego obrazu. Proponuję użyć jakiegoś rodzaju perlin noise, aby przesunięcie nie było przypadkowe. Oto dobry link na temat generowania szumu perlinowego.
Gdy mamy hałas możemy zrobić coś takiego:
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);
}
}
Thanks Andreas. Właśnie tego szukałem. Dzięki jeszcze raz – megha