@Popou

Что не так с синусом?

Я хотел сделать подобный эффект волны :

60f923262805e176312543.jpeg

Для этого я использовал следующий алгоритм:
for (int y = 0; y < img.Height; ++y)
{
    Span<Rgba32> pixelRowSpan = img.GetPixelRowSpan(y);
    for (int x = 0; x < img.Width; ++x)
    {

        int y1 = Convert.ToInt32(y + 20.0 * Math.Sin(x / 32.0));

        if (y1 >= img.Height)
            y1 = img.Height - 1;
        if (y1 < 0)
            y1 = 0;

        var sourcePixel = img.GetPixelRowSpan(y1)[x];

        pixelRowSpan[x] = sourcePixel;
    }
}


Но вместо желаемого результата, у меня выходит это:
irctn-afdpmwoufhtzaj0qufxme.jpeg

Исходное изображение :
67427.jpg

Спасибо Wataru!
Исходное изображение :
s-9wp4wxny83thhluknnmirhcxe.jpeg

Результат :
5tqvub57okwctvybjbf3ode3zq4.jpeg
  • Вопрос задан
  • 379 просмотров
Решения вопроса 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Вы меняете изображение на месте, проходя по нему сверху вниз. Когда ваш синус сдвигает пиксели вниз - вы перетираете все пиксели в столбце самым верхним.

Надо или копировать с изменениями в новое изображение, или менять направление прохода в зависимости от знака синуса.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы