Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Processing:Примеры/Дерево

Материал из Онлайн справочника
Перейти к: навигация, поиск


Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Ambox content.png Черновик


Описание[1]

Этот скетч-пример при помощи рекурсии рендерит древоподобную структуру. Угол ветвления рассчитывается при помощи функции, в которой используется положение курсора на оси X.

Перемещайте курсор мышки влево-вправо, чтобы менять угол ветвления.

Пример

  1. float theta;  
  2.  
  3. void setup() {
  4.   size(640, 360);
  5. }
  6.  
  7. void draw() {
  8.   background(0);
  9.   frameRate(30);
  10.   stroke(255);
  11.   // рассчитываем угол в диапазоне от 0 до 90 градусов
  12.   // на основе позиции курсора на оси X:
  13.   float a = (mouseX / (float) width) * 90f;
  14.   // конвертируем его в радианы:
  15.   theta = radians(a);
  16.   // начинаем дерево в нижней части экрана:
  17.   translate(width/2,height);
  18.   // рисуем линию длиной 120 пикселей:
  19.   line(0,0,0,-120);
  20.   // перемещаемся к концу этой линии:
  21.   translate(0,-120);
  22.   // запускаем рекурсивное ветвление!
  23.   branch(120);
  24.  
  25. }
  26.  
  27. void branch(float h) {
  28.   // каждая ветвь – это 2/3 от длины предыдущей ветви:
  29.   h *= 0.66;
  30.  
  31.   // у всех рекурсивных функций должно быть условие выхода!!!!!
  32.   // в нашем случае этим условием будет,
  33.   // если длина ветви составляет 2 пикселя или меньше:
  34.   if (h > 2) {
  35.     pushMatrix();    // сохраняем текущее состояние трансформации
  36.                      // (т.е. то, где мы находимся сейчас)
  37.     rotate(theta);      // вращаем на угол «theta»
  38.     line(0, 0, 0, -h);  // рисуем ветвь
  39.     translate(0, -h);   // перемещаемся к концу ветви
  40.     branch(h);          // окей, теперь вызываем сами себя,
  41.                         // чтобы нарисовать две новые ветви!!!
  42.     popMatrix();        // каждый раз, добираясь сюда, возвращаем
  43.                         // предыдущее состояние матрицы
  44.    
  45.     // повторяем то же самое, только для ветвления «влево»:
  46.     pushMatrix();
  47.     rotate(-theta);
  48.     line(0, 0, 0, -h);
  49.     translate(0, -h);
  50.     branch(h);
  51.     popMatrix();
  52.   }
  53. }

См.также

Внешние ссылки

  1. processing.org - Recursive Tree by Daniel Shiffman.