Школа поэтических вычислений, неделя 5, осень 2019 г.

Четыре* незавершенных снимка экрана, которые я сделал с домашним заданием на 4-й неделе для класса Зака, кажутся хорошей метафорой моих циклов эмоций, день за днем, теперь, когда мы находимся примерно на полпути в нашем приключении «Школа поэтических вычислений».

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

Через час все кажется более запутанным, чем казалось сначала

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

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

Картинка выше — моя незавершенная воссоздание одного из плакатов Морисавы Джона Маэды (этого). Вы могли заметить, что первые три изображения выше — это сплошные буквы, а на последнем — контуры. Зак прислал мне пример кода того, как заставить буквы вращаться, не улетая вдаль, используя метод контура. Я подумал, здорово! Я начал свой проект с заполненных букв, так что будет тривиально заполнить контур, как только буквы будут вращаться, как должны! Оказывается, это не так, и заполнить буквы обратно на самом деле очень сложно.

Вот код, чтобы начать настройку текста с помощью контуров:

string messageText = "MOUWRAO";
int fontSize = 98;
font.load("frabk.ttf", fontSize, true, true, true);
vector <ofPath> myWord = font.getStringAsPoints(messageText, true, false);

getStringAsPoints(messageText, true, false) — ключевое отличие от того, что я делал раньше, когда в качестве третьего аргумента было установлено значение true. Оказывается, установка значения false для настройки ofPath для ofPolyline по существу отбрасывала информацию, необходимую для создания заполненных форм. Таким образом, даже когда я вызывал блок, который когда-то создавал заполненное слово, и даже добавлял ofFill(), чтобы попытаться вернуть одно из моих заполненных слов, это все еще был контур, потому что вектор больше не имел данные, необходимые для заполнения букв:

// ofFill() does nothing
for(int i=0; i < 7; i++){
    ofFill();
    myWord[i].draw(0, 100);
}

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

for (int i=0; i< 100; i++){
     ofSetColor(255, 255, 255, 255 / (i* 0.5));
    
    for (int j=0; j<7; j++){
      vector < ofPolyline > lines = myWord[j].getOutline();

      ofRectangle bounds;
      bool bSet = false;
      
      for(int k=0; k < lines.size(); k++){
        for(int l=0; l < lines[k].size(); l++){
          if(bSet==false)bounds.setPosition(lines[k][l]);
          else bounds.growToInclude(lines[k][l]);
          bSet = true;
        }
      }
      // now that we've got the bounds, save the center
      ofPoint center = bounds.getCenter();
      
      //subtract the center to draw from (0,0)
      for(int k=0; k < lines.size(); k++){
        for(int l=0; l < lines[k].size(); l++){
          // change the position of the line
          lines[k][l] -= center;
        }
      }

      ofPushMatrix();
      ofTranslate(center.x, center.y + i * 10 + 200);
      ofRotateYDeg(i * 708);//708 * 0.5);
      ofRotateXDeg(i * 1092);//1092 * 0.5);
      
      for(int k=0; k < lines.size(); k++){
        //draw the transformed lines
        lines[k].draw();
      }
      ofPopMatrix();
  }
}

Причина, по которой я был сбит с толку, заключалась в том, что когда я впервые попытался заставить код примера работать, все было сломано, пока я не заметил, что третий аргумент в getStringAsPoints должен быть переключен на false, а затем он волшебным образом отобразился так, как предполагалось. Это исправление было практически запоздалым, когда я пытался заставить его работать. Я не понимал, пока Алекс и, наконец, Зак тоже не врубились, что флаг был ключом к моему непониманию того, как работает создание схемы с помощью ofPolyline.

Может показаться хлопотным удивляться чему-то, что оказывается намного сложнее, чем вы думаете, но в итоге это оказалось полезным путешествием. Я обратился к Алексу за помощью, и он был озадачен тем, как это сделать, поэтому он обратился за помощью к Заку, и Зак заверил Алекса, который позже заверил меня, что это было трудно сделать. Алекс и я оба чувствовали, что мы, возможно, упускаем что-то очень простое или, может быть, мы сходим с ума, поэтому было важно узнать, что то, что мы изо всех сил пытались понять, было на самом деле сложным, и у нас не было чего-то неправильного. основу наших знаний об OpenFrameworks и C++.

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

*для прозрачности обратите внимание, что на самом деле я сделал гораздо больше, чем 4 скриншота, которые я затем просеял, чтобы найти для этого сообщения в блоге, которые создают иллюзию, что мой процесс соответствует повествованию — никогда не верьте примерам