Природные Катастрофы

Интересуясь компьютерной графикой, я заметил, что сочетание правил и случайности может давать неожиданно красивые результаты.

С одной стороны, глядя на такие изображения, очевидно их компьютерное происхождение, с другой — фактор случайности делает их уникальными и непредсказуемыми.

Еще я заметил, что многократное повторение даже неприглядных форм создает гармоничные рисунки, если рассматривать их целиком.



Природные катастрофы



Природные катастрофы



Природные катастрофы

Как и большинство программистов, я написал много кода для рисования, начиная с 1993 года на Basic for Spectrums, затем на Pascal, C++.

Мониторы становятся лучше, разрешения выше, процессоры быстрее, и я решил «вспомнить молодость» :) Я написал еще одного электронного художника на C# (с использованием GDI+).

Алгоритм прост:

  1. Создайте случайную изогнутую линию случайного цвета;

    Природные катастрофы

  2. Дублируем его много раз с постепенным вращением вокруг «локального» центра, чтобы получился «круг»;

    Природные катастрофы

  3. Дублируем этот «круг» несколько раз вокруг «общего» центра, также поворачивая его, чтобы образовался «слой»;

    Природные катастрофы

  4. Таким образом мы создаем несколько «слоев», накладывающихся друг на друга.



    Природные катастрофы

Вот и все, готово.

Если хотите, можете сделать небольшую постобработку.

Код прост:

  
  
   

Parameters.Color = GetRandomColor(); var stars = new Star[Parameters.Random.Next(Parameters.MinStarCount, Parameters.MaxStarCount)]; for (var i = 0; i < stars.Length; i++) { stars[i] = new Star(); stars[i].

GenerateRandom(); } progressBar.Maximum = stars.Length + 1; var bitmap = new Bitmap(Parameters.PictureSide, Parameters.PictureSide); progressBar.Increment(1); using (var gr = Graphics.FromImage(bitmap)) { gr.SmoothingMode = SmoothingMode.HighQuality; gr.Clear(Color.Empty); gr.TranslateTransform((float)bitmap.Width / 2, (float)bitmap.Height / 2); foreach (var star in stars) { star.Draw(gr); progressBar.Increment(1); } } pictureBox.Image = bitmap;

И

public void Draw(Graphics gr) { var rad = Parameters.PictureSide / 2; float radius = Parameters.Random.Next(Splines.Spline.MaxRadius, rad - Splines.Spline.MaxRadius); try { Splines.Start(); float phase = Parameters.Random.Next(360); var oldMatrix = gr.Transform; for (var i = 0; i < RayCount; i++) { var angle = 360f * (i / (float)RayCount); gr.RotateTransform(phase + angle); gr.TranslateTransform(radius, 0); Splines.Draw(gr); gr.Transform = oldMatrix; } } finally { Splines.Stop(); } }

И

public void Draw(Graphics gr) { var oldMatrix = gr.Transform; for (var i = 0; i < _rotateCount; i++) { var angle = 360f * (i / (float)_rotateCount); gr.RotateTransform(angle); Spline.Draw(gr); gr.Transform = oldMatrix; } }

Скомпилировано для .

NET 4 (работает на 64-разрядной версии Win7).

Максимальное разрешение изображения — 460 мегапикселей (квадрат со стороной 22 тысячи пикселей).

Каждая картинка генерируется за несколько секунд. Конечно, не все комбинации случайных параметров удачны.

Из десятка случайных картинок я на глазок выбираю лишь парочку самых удачных.

Таким образом, примерно за 15 минут вы сможете сгенерировать несколько десятков уникальных изображений.

Коллекцию работ, нарисованных таким способом, можно посмотреть здесь И здесь (другой алгоритм) .

В свободное время я даже не поленился и сделал галерею этих рисунков на Silverlight с использованием DeepZoom Примеры картинок, полученных по описанному алгоритму:

Природные катастрофы



Природные катастрофы



Природные катастрофы



Природные катастрофы



Природные катастрофы



Природные катастрофы



Природные катастрофы



Природные катастрофы

P.S.: Вернувшись с работы, я нашел много интересных комментариев к статье.

Спасибо за понимание! В знак благодарности сообществу публикую это публично.

скомпилированное приложение для экспериментов.

Если кому интересно, могу выслать код. Теперь все параметры зашиты непосредственно в код. Требуется dotNet Framework 4, размер создаваемого изображения — 4096 x 4096 пикселей.

Делал для себя, поэтому интерфейс минималистичный.

Нажмите на картинку, чтобы создать новую.

Остальное в меню.

P.P.S. По просьбам читателей выкладываю для изучения полный исходный код проекта ( зеркало ).

P.P.P.S. В комментариях и в личке есть просьбы рассказать об алгоритме «плющ».

Я описал алгоритм в Комментарии , и здесь исходный код и скомпилированный exe-файл ( зеркало ).

Теги: #Аномальное программирование #Алгоритмы #графика #.

NET #C++ #искусство #творчество #Аномальное программирование

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.