Генеративное Искусство: Создание Треугольников После 3 Часов Изучения P5.Js

У меня мало опыта использования компьютера для творчества и искусства.

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

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



Генеративное искусство: создание треугольников после 3 часов изучения p5.js

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

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

Перед запуском проекта мы обсуждали эту концепцию, но пришли к выводу, что это слишком сложно сделать, учитывая, что мы потратили всего 3 часа на изучение p5.js. Я посмотрел библиотеки, реализующие эту концепцию, но решил на практике создать собственное решение.

Мне сложно рисовать в путешествии, но как только я смог остановиться, я набросал вот это:

Генеративное искусство: создание треугольников после 3 часов изучения p5.js

Набросок того, как я мог бы подойти к реализации этой концепции, сделанный после долгого путешествия.

Что если вместо случайных координат для создания треугольников я мог бы:

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

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

Создание сетки

Чтобы я мог видеть свои идеи, я разместил на холсте (поверхности) сетку:
  
  
  
  
   

function setup() { createCanvas( windowWidth, windowHeight ) colorMode( HSB ) noLoop() noStroke() } function draw() { background( 20, 20, 20) // Setup a grid so i can figure out the uppper and lower bounds // of where the points should go var columns = 5 var rows = 5 var columnWidth = windowWidth / columns var columnHeight = windowHeight / rows fill( 30, 30, 30) stroke( 90, 90, 90 ) rect( 0, 0, columnWidth, columnHeight ) // Create a row for ( i = 0; i < rows; i++ ){ // Create a column for ( j = 0; j < columns; j++ ){ rect( j * columnWidth, i * columnHeight, columnWidth, columnHeight ) } } }

И в итоге получается вот так.

Неплохое начало.



Генеративное искусство: создание треугольников после 3 часов изучения p5.js

Базовая сетка

Генерация случайных точек

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

Просто чтобы визуализировать, где создаются точки.

Прямо внутри цикла столбцов я написал:

for ( j = 0; j < columns + 1 ; j++ ){ rect( j * columnWidth, i * columnHeight, columnWidth, columnHeight ) //create my point var pointPositionX = random( j * columnWidth - columnWidth, j * columnWidth ) var pointPositionY = random( i * columnHeight - columnHeight, i * columnHeight ) circle( pointPositionX, pointPositionY, 10 ) }

и получил несколько баллов:

Генеративное искусство: создание треугольников после 3 часов изучения p5.js

Визуализация координат

Хранение координат в массивах

Чтобы вернуться назад и сформировать треугольники, мне нужно где-то сохранить все эти координаты.



for ( i = 0; i < rows + 1; i++ ){ var columnData = [] // Create a column for ( j = 0; j < columns + 1 ; j++ ){ rect( j * columnWidth, i * columnHeight, columnWidth, columnHeight ) //create my point var pointPositionX = random( j * columnWidth - columnWidth, j * columnWidth ) var pointPositionY = random( i * columnHeight - columnHeight, i * columnHeight ) columnData.push( [pointPositionX, pointPositionY] ) console.log( columnData ) //circle( pointPositionX, pointPositionY, 10 ) } allCoordinates.push( columnData ) console.log( allCoordinates ) }

Прошло несколько лет с тех пор, как я писал на JavaScript, но мне все еще кажется, что это легко дается.

Это то, что я вывожу на консоль.

Думаю, мне удалось приблизиться к тому, что я намеревался.

за исключением отрицательных чисел.



Генеративное искусство: создание треугольников после 3 часов изучения p5.js

Те цифры, которые кажутся почти верными

Первый треугольник

Да, эти отрицательные цифры были ошибкой.

Иногда математика кажется мне странной – зачем мне вычитать из 0? Кто знает. Наверное, я думал, что мне и Джей было 1? Короче говоря, я это исправил.

Я также понятия не имею, зачем мне понадобились два массива.

Мне следовало просто сохранить все координаты в массиве allCoordinates[].

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

Вот как в итоге получился код:

var allCoordinates = []; // Create a row for ( i = 0; i < rows + 1; i++ ){ // Create a column for ( j = 0; j < columns + 1 ; j++ ){ rect( j * columnWidth, i * columnHeight, columnWidth, columnHeight ) //create my point var pointPositionX = random( j * columnWidth + columnWidth, j * columnWidth ) var pointPositionY = random( i * columnHeight + columnHeight, i * columnHeight ) allCoordinates.push( [pointPositionX, pointPositionY] ) circle( pointPositionX, pointPositionY, 10 ) console.log(allCoordinates) } } // Create the first triangle fill( 90, 90, 90 ) var currentPoint = 0 var firstPointX = allCoordinates[0][0] var firstPointY = allCoordinates[0][1] var secondPointX = allCoordinates[1][0] var secondPointY = allCoordinates[1][1] var thirdPointX = allCoordinates[6][0] var thirdPointY = allCoordinates[6][1] triangle( firstPointX, firstPointY, secondPointX, secondPointY, thirdPointX, thirdPointY )

И результат:

Генеративное искусство: создание треугольников после 3 часов изучения p5.js

О, первый треугольник на правильном месте! Большой! Теперь мне нужно сделать из этого цикл и пройти по каждому из них.



После 2 часов зависания моего браузера.

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

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

Наконец я дошел до того момента, когда был доволен результатом и знал, что, потратив еще час на работу, я мог бы получить почти идеальный результат, но я был готов двигаться дальше и не быть перфекционистом.

Я не буду показывать промежуточный код, только визуальные результаты:

Генеративное искусство: создание треугольников после 3 часов изучения p5.js

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



Вернемся к художественной стороне всего этого дела.

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

Я приближался к окончательному результату.



Генеративное искусство: создание треугольников после 3 часов изучения p5.js

Приближаюсь к результату, который мне нравится

Финальный рендеринг и довольно неряшливый код

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

Это окончательный рендеринг:

Генеративное искусство: создание треугольников после 3 часов изучения p5.js

Окончательный рендеринг, который я сделал перед тем, как назвать его, завершен.

Я думаю, мне это нравится! А сам код находится в p5.js. Оно не закончено, но отражает процесс творческих терзаний.

Наслаждаться! Окончательный код

function setup() { var canvas = createCanvas( 1600, 1600 ) canvas.parent("canvasArea"); colorMode( HSB ) noLoop() noStroke() } function draw() { background( 197, 31, 65 ) // Setup a grid so i can figure out the uppper and lower bounds // of where the points should go var columns = 20 var rows = 20 var columnWidth = 1600 / columns var columnHeight = 1600 / rows // Show the grid fill( 18, 11, 18 ) //stroke( 90, 90, 90 ) //rect( 0, 0, columnWidth, columnHeight ) var allCoordinates = []; // Create a row for ( i = 0; i < rows; i++ ){ // Create a column for ( j = 0; j < columns ; j++ ){ rect( j * columnWidth, i * columnHeight, columnWidth, columnHeight ) //create my point var pointPositionX = random( j * columnWidth + columnWidth, j * columnWidth ) var pointPositionY = random( i * columnHeight + columnHeight, i * columnHeight ) allCoordinates.push( [pointPositionX, pointPositionY] ) circle( pointPositionX, pointPositionY, 10 ) } } var whichRow = 1 var l = 1 while ( l < allCoordinates.length ){ //firstTriangle if (whichRow == 1 || whichRow == rows){ //don't do anything on the first and last row (thse need just one triangle) } else{ if ( (l + 1) % rows == 0 || l == 0){ console.log("it's the last item, do nothing") } else{ //Triangle 1 var colorChoices = [ [45, 15, 75], [22, 42, 95], [5, 55, 75], [0, 61, 95] ] var randomColorChoice = Math.floor(random(0,4)) fill( colorChoices[randomColorChoice][0], colorChoices[randomColorChoice][1], Math.floor(random(50,100)) ) //stroke( 200, 90, 90 ) var currentPoint = l var nextPoint = l + 1 var bottomPoint = l + rows var firstPointX = allCoordinates[currentPoint][0] var firstPointY = allCoordinates[currentPoint][1] var secondPointX = allCoordinates[nextPoint][0] var secondPointY = allCoordinates[nextPoint][1] var thirdPointX = allCoordinates[bottomPoint][0] var thirdPointY = allCoordinates[bottomPoint][1] triangle(firstPointX, firstPointY, secondPointX, secondPointY, thirdPointX, thirdPointY) //Triangle 2 randomColorChoice = Math.floor(random(0,4)) fill( colorChoices[randomColorChoice][0], colorChoices[randomColorChoice][1], Math.floor(random(50,100)) ) //stroke( 200, 90, 90 ) var currentPoint = l var nextPoint = l - rows var bottomPoint = l + 1 var firstPointX = allCoordinates[currentPoint][0] var firstPointY = allCoordinates[currentPoint][1] var secondPointX = allCoordinates[nextPoint][0] var secondPointY = allCoordinates[nextPoint][1] var thirdPointX = allCoordinates[bottomPoint][0] var thirdPointY = allCoordinates[bottomPoint][1] triangle( firstPointX, firstPointY, secondPointX, secondPointY, thirdPointX, thirdPointY ) } } l++ if ( l % rows == 0 ){ whichRow++ } } }

Если вы хотите попробовать что-то еще или начать с более простых проектов:
  • Создание эффекта быстрого полета в космосе (или падающего снега) за 10 минут с помощью p5.js
  • Как воссоздать эффект муарового узора в библиотеке p5.js новичку (краткое руководство)
  • Применение 2d-текстуры к 3D-объекту с помощью p5.js (часть 1 — создание узора)
  • Применение 2d текстуры к 3d объекту с помощью p5.js (часть 2 – применение паттерна к кубу)
Теги: #дизайн #JavaScript #Визуализация данных #Графический дизайн #веб-дизайн #Обработка изображений #искусство #Генеративное искусство #генеративный дизайн #p5.js #p5.js #процедурная генерация #процедурная генерация #процедурное искусство #креативное кодирование
Вместе с данным постом часто просматривают:

Автор Статьи


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

Dima Manisha

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