Processing:Примеры/Дерево
Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Содержание | Среда разработки Processing | Справочник языка Processing | Библиотеки | Примеры | Режимы программирования |
Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.
Описание[1]
Этот скетч-пример при помощи рекурсии рендерит древоподобную структуру. Угол ветвления рассчитывается при помощи функции, в которой используется положение курсора на оси X.
Перемещайте курсор мышки влево-вправо, чтобы менять угол ветвления.
Пример
float theta;
void setup() {
size(640, 360);
}
void draw() {
background(0);
frameRate(30);
stroke(255);
// рассчитываем угол в диапазоне от 0 до 90 градусов
// на основе позиции курсора на оси X:
float a = (mouseX / (float) width) * 90f;
// конвертируем его в радианы:
theta = radians(a);
// начинаем дерево в нижней части экрана:
translate(width/2,height);
// рисуем линию длиной 120 пикселей:
line(0,0,0,-120);
// перемещаемся к концу этой линии:
translate(0,-120);
// запускаем рекурсивное ветвление!
branch(120);
}
void branch(float h) {
// каждая ветвь – это 2/3 от длины предыдущей ветви:
h *= 0.66;
// у всех рекурсивных функций должно быть условие выхода!!!!!
// в нашем случае этим условием будет,
// если длина ветви составляет 2 пикселя или меньше:
if (h > 2) {
pushMatrix(); // сохраняем текущее состояние трансформации
// (т.е. то, где мы находимся сейчас)
rotate(theta); // вращаем на угол «theta»
line(0, 0, 0, -h); // рисуем ветвь
translate(0, -h); // перемещаемся к концу ветви
branch(h); // окей, теперь вызываем сами себя,
// чтобы нарисовать две новые ветви!!!
popMatrix(); // каждый раз, добираясь сюда, возвращаем
// предыдущее состояние матрицы
// повторяем то же самое, только для ветвления «влево»:
pushMatrix();
rotate(-theta);
line(0, 0, 0, -h);
translate(0, -h);
branch(h);
popMatrix();
}
}
См.также
Внешние ссылки
Примеры на Processing | |
---|---|
Основы |
|
Продвинутые графические эффекты |
|
Примеры из сторонних библиотек |