Изокод

Подписаться на эту рубрику по RSS

пишем как рисуем…

Мечта о понастоящему жирной кисти

Понедельник, 19 июля 2010 г.
Рубрика: Компутериум -> Изокод -> Популярно
Подписаться на комментарии по RSS

Где-то глубоко в подсозании, на самой его поверхности - живо ощущение, что кисть может быть гораздо жирней и фееричней чем обычно... Как будто это один из утерянных или тщательно забытых аспектов. Взмах и вот он холм, еще взмах и вот оно дерево, облака и они поплыли, а дерево шевелится, а холм медленно тонет в озере, которое само накапало из туч...

boldbrush

А поскольку - время настало...

Вот она рисовалка, отчасти соотвествующая, пускай не всем но части деклараций о красоте и легкости ее достижения: http://nemehanika.ru/cg/pde/i%20painter/ - на правой кнопке мыши найдете все доступные опции, такие как цвет, тип кисти, прозрачность, режимы стирания и т.д. Исходный код найдется там же... А полное собрание, как обычно, на: http://nemehanika.ru/cg/

Coding Gene... - ration!

Понедельник, 26 апреля 2010 г.
Рубрика: Компутериум -> Изокод -> Популярно
Подписаться на комментарии по RSS
открываем новый проект: форум по программированию пикселей на нестандартное поведение - образовательный ресурс для подрастающих программистов красоты - Coding Gene

Пока в тестовом режиме, но там уже есть кое-что интересненькое: например C++ версия программы Array из прошлого урока по Processing-у. А что получается, если программу из Java переделать на C++? Получается красота в полный экран... и с такой производительностью, что можно еще в три раза навернуть, а современный процессор - даже и не поперхнется... чем и займемся - вскоре.

А пока, поставьте себе Visual C++ Express Edition разверните архив Array в корень диска D:, должно получится D:\p_Cpp. Запустите файл D:\p_Cpp\Projects\CG_Array\Array.vcproj, позвольте запустившейся Visual Studio преобразовать проект (отказавшись от бэкапа). В левой панели дерева проекта, разверните вкладку Source Files и кликнете CG_Array.cpp, смотрите, читайте, компилируйте, запускайте, экспериментируйте. В ближайшем будущем, подробно обо всем - на nemehanika.ru/cg.

Массив псевдо-пикселей

Вторник, 20 апреля 2010 г.
Рубрика: Изокод
Подписаться на комментарии по RSS
Processing... Что? Это пароль! Если это слово вам - не известно, начините с первого занятия по увлекательному программированию, а всего их было раз, два, три... Вернулись? Не ходили? Едем дальше... Возьмем код здесь.
Вставили, запустили? Повозите мышку, жмите стрелки Вверх, Вниз и Enter:

Так вот... Помнится были обещаны массивы, и это еще до того, как рассказать о переменных... С другой стороны, если изучать сразу сложное (ну... не очень...), может быть не придется учить простое? Поэтому начнем сразу с массивов, минуя одиночные переменные. В отличие от них - одномерный массив похож на поезд в котором - n вагонов: переменных, а двумерный - на одноэтажный дом в котором n * m квартир. Так ведь есть еще и трехмерные массивы... - настоящие небоскребы: n * m квартир * z - этажей. На что похожи четырехмерные массивы - знают небоскребы и космонавты. Это как n * m * z и * f - параллельных вселенных в каждой из которых на одном и том же месте стоит не один и тот же n * m * z небоскреб. Вот и весь смысл массивов - упорядоченное общежитие однотипных переменных. Вот смотрите вы на экран..., а в нем X * Y - пикселей, а в каждом пикселе по три цветовых составляющих - |||. Вот жмете вы по кнопкам, а...

В Processing-е массив, к примеру - из целочисленных переменных, объявляется так: int[][] arr;

Конкретный размер придается ему методом создания: arr = new int[25][25];

Если мы хотим "заселить" переменную в "квартиру" 17,8 - пишем: arr[17][8] = 314;

Если хотим узнать-скопировать, что у нас в 4,21 - пишем: int a = arr[4][21];

А что такое int a? - если не объявление целочисленной переменной по имени a.

Что такое обработка массивов? А зачем? А вот, например, за этим: изображение у нас умеет ездить вверх и вниз благодаря этим двум функциям:

Они обе - есть пересыпание строк нашего двумерного массива. А если пересыпать столбцы? - Изображение будет ездить влево и вправо..., для чего - можно написать еще две такие функции с соответствующими названиями и "подключить" их в функции vFilter(), а так же добавить парочку новых условий в функции keyPressed().

Что такое условия? Узнаем мимоходом в следующий раз. И ни в коем случае - не пытайтесь догадаться сами... И тем-более: не жмите кнопку Reference в меню Help - так вы вообще рискуете во всем разобраться...

Фундамент и Инерция

Вторник, 26 января 2010 г.
Рубрика: Изокод
Подписаться на комментарии по RSS
Если слово Processing вам ни о чем не говорит, значит вы достигли наконец второго уровня неуловимости, а именно: пропустили первое и второе занятия по программированию красоты и гармонии. Вернулись? Продолжаем...

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

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

Функция подобна стиральной машинке, утюгу или миксеру. Каждая конкретная функция в "доме" программы - одна, а использовать ее можно - многократно. Программы с программистами после этого сразу сильно похорошели... А вождь племени подумал тогда о том, что неплохо бы ввести налог на удовольствия получаемые от программирования... и тут же был свергнут шестью различными способами в цикле от 0 до 15-ти.

Вставляем в Processing данный код. А... давайте сразу запустим и порисуем:

Теперь смотрим код. Заметьте, выражения типа x += vx являются сокращенной записью, в данном случае от выражения x = x + vx. А, например, x-- соответствует x = x - 1. Но это так... - удобные мелочи. Дальше - больше.

В двух местах мы наблюдаем вызов одной и той же функции - drawRandomSpot2(...). Ей с собой выдаются параметры: координаты, радиус и цвет. А уж она там сама знает - что рисовать. Удобно? Красиво? Вот и у всех программистов мира - тоже так... Теперь промотаем вниз и обнаружим сами функции:

Да, да, да, их то тут три, а не одна... А зачем? Если у всех входные параметры - одинаковые, а внутренности (реализации) - разные. Вот и догадайтесь с одной подсказкой: - Для развлечения, конечно! Ну ладно, еще подсказка (подозреваю - опоздавшая)... Результатом применения функций является не только выразительная читаемость - понятность кода и не только уменьшение объема его в сотни раз..., а так же - необычайная гибкость. Ведь тогда, разные варианты исполнения того или иного действия - пишутся как несколько функций с разной реализацией. Потом, чтобы сменить одно на другое - достаточно переименовать вызов функции, а не заменять одни куски кода другими кусками, попутно исправляя названия переменных (стал бы до-архитектор по пустякам нервничать?).

Чуть не забыл! Вторая штучка - это инерция. Ее присутствие оживляет нашу программу не совсем прямым управлением процессом рисования. Как это достигнуто? При помощи простейшей математики и переменной - cInertion: это такой обратный счетчик, который затухает от максимального значения - maxInertion до нуля. А значит процесс рисования не завершается сразу как мы отпускаем (куда?) мышь, а продолжается еще некоторое время: еще несколько кадров.

А вот то, что в тексте программы фигурирует некто по имени массив, мы пока - благоразумно не заметим. Надо же что-то оставить и на завтра...

Циклопы любят все повторять по много раз...

Воскресенье, 24 января 2010 г.
Рубрика: Изокод
Подписаться на комментарии по RSS
Кто пропустил первое занятие по программированию? - Пожалуйте сюда. Там вы узнаете, что такое Processing и с чем его хотят. Узнали? Едем дальше...

Продолжаем играючи изучать программирование красоты. Сегодня у нас в гостях цикл-оп. Выглядит не страшно, циклится не вечно - столько сколько попросим, повторяет все, что укажем. Немногословен от природы, поэтому придется мне за него выступить.

Берем код здесь и вставляем его в Processing, видим:

Так уж получается, что иногда за один раз (один кадр нашей анимации) надо нарисовать несколько штучек, а не одну. Тогда нужен цикл: возможность объяснить компьютеру сколько раз нам надо выполнить одно и тоже действие или компанию действий. Смотрим выделенную строчку и... даже объяснить то - нечего. В хорошем языке программирования всегда так - самый минимум необходимого, прямо как тут: for(для) переменной i начинаем с нуля и заканчиваем на 299 (повторяем пока i ), приращивая к i по единичке. Синтаксис - не нарушаем: скобки, точки с запятыми - все это на своих местах, пробелы - по желанию. И тогда мы выполняем 300 раз то, что находится в фигурных скобках. Запускаем, останавливаем. Последовательно оживляем закомментированные наклонными слешами строчки и опять запускаем. Получаем варианты красоты:

  

С цветом экспериментировать будете? А с числами? Все числа типа 0.001, 1.025... - чистые подгонки, чтобы что-то было не слишком крупное, другое не слишком мелкое, третье вращалось быстрее и так далее... - находятся экспериментальным путем. Поменяйте их, чтобы увидеть - что имеется в виду. А fill(0,0,0,5) для этого напишите как fill(0,0,0) - пропадет эффект затухания, формы станут виднее. Погадайте о смысле последней цифры в fill(0,0,0,5). Гадать конечно лучше - экспериментально, максимальное значение - 255.

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

Рисовалка номер Раз

Пятница, 15 января 2010 г.
Рубрика: Изокод
Подписаться на комментарии по RSS
Photoshop, CorelDraw, Painter, Illustrator, SamNapisal... Что? О последнем можно подробнее? - Конечно. Хорошо, что вы спросили. Если бы не ваша живая реакция, пришлось бы прибегнуть к плану Аа. Ну раз не пришлось, то вот:

Добываем себе Processing, для этого: заходим на processing.org, ощупываем достопримечательности, находим и качаем его. Установка не требуется, распаковываем в любое удобное место. Запускаем. Смотрим: Да это же среда программирования!... хорошо, что не четверг. Чт-о-о-о? Вы не программист? Отлично! Мы тут не программировать собрались, мы тут - баловаться развлекаемся.

Отсюда копируем код. Вставляем его в запущенный Processing и видим:

И не пытайтесь пугаться: тут комментариев - больше чем кода, а код бывает неизмеримо длиннее и забористей. А это, всего лишь - маленькая, простая, но уже кое-что рисующая программка, написанная на графическом диалекте языка Ява, необычайно лаконичном и мощном. Встречайте! Это - Processing, высокотехнологичный повод для процесса удовольствия от процесса созидания.

Итого: Тот код, что серый за двумя слешами (неактивен пока...) - для баловаться, остальной - чтоб развлекаться. Комментарии - чтобы... Разумно меняем все что угодно. Жмем запуск. Если ошибки - откатываемся, или даже читаем их в нижнем окошке и понимаем - чего надо? А! Синтаксис... Если же запускается - видим окно, в нем рисуем мышкой:

Радуемся. Закрываем. Снова меняем. Опять запускаем. Так мы познаем прелесть изучения программирования на основе игры с примерами кода. Предка всех программистов никто не учил разведению костра - он сам догадался, на случайном примере, затем запрограммировал сородичей... А у нас, кроме костра, еще и хелп есть. И вопросы любые задать в комментариях - не постесняемся.