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

Processing:Примеры/L-система в виде пятиэлементного фрактала Маквортера

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


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

Контакты:

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


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


Описание[1]

Этот код основан на классе LSystem Патрика Дваера.

Пример

  1. PentigreeLSystem ps;
  2.  
  3. void setup() {
  4.   size(640, 360);
  5.   ps = new PentigreeLSystem();
  6.   ps.simulate(3);
  7. }
  8.  
  9. void draw() {
  10.   background(0);
  11.   ps.render();
  12. }
  13.  
  14.  
  15.  
  16.  
  17. class PentigreeLSystem extends LSystem {
  18.  
  19.   int steps = 0;
  20.   float somestep = 0.1;
  21.   float xoff = 0.01;
  22.  
  23.   PentigreeLSystem() {
  24.     axiom = "F-F-F-F-F";
  25.     rule = "F-F++F+F-F-F";
  26.     startLength = 60.0;
  27.     theta = radians(72);  
  28.     reset();
  29.   }
  30.  
  31.   void useRule(String r_) {
  32.     rule = r_;
  33.   }
  34.  
  35.   void useAxiom(String a_) {
  36.     axiom = a_;
  37.   }
  38.  
  39.   void useLength(float l_) {
  40.     startLength = l_;
  41.   }
  42.  
  43.   void useTheta(float t_) {
  44.     theta = radians(t_);
  45.   }
  46.  
  47.   void reset() {
  48.     production = axiom;
  49.     drawLength = startLength;
  50.     generations = 0;
  51.   }
  52.  
  53.   int getAge() {
  54.     return generations;
  55.   }
  56.  
  57.   void render() {
  58.     translate(width/4, height/2);
  59.     steps += 3;          
  60.     if (steps > production.length()) {
  61.       steps = production.length();
  62.     }
  63.  
  64.     for (int i = 0; i < steps; i++) {
  65.       char step = production.charAt(i);
  66.       if (step == 'F') {
  67.         noFill();
  68.         stroke(255);
  69.         line(0, 0, 0, -drawLength);
  70.         translate(0, -drawLength);
  71.       }
  72.       else if (step == '+') {
  73.         rotate(theta);
  74.       }
  75.       else if (step == '-') {
  76.         rotate(-theta);
  77.       }
  78.       else if (step == '[') {
  79.         pushMatrix();
  80.       }
  81.       else if (step == ']') {
  82.         popMatrix();
  83.       }
  84.     }
  85.   }
  86.  
  87. }
  88.  
  89.  
  90.  
  91. class LSystem {
  92.  
  93.   int steps = 0;
  94.  
  95.   String axiom;
  96.   String rule;
  97.   String production;
  98.  
  99.   float startLength;
  100.   float drawLength;
  101.   float theta;
  102.  
  103.   int generations;
  104.  
  105.   LSystem() {
  106.  
  107.     axiom = "F";
  108.     rule = "F+F-F";
  109.     startLength = 90.0;
  110.     theta = radians(120.0);
  111.     reset();
  112.   }
  113.  
  114.   void reset() {
  115.     production = axiom;
  116.     drawLength = startLength;
  117.     generations = 0;
  118.   }
  119.  
  120.   int getAge() {
  121.     return generations;
  122.   }
  123.  
  124.   void render() {
  125.     translate(width/2, height/2);
  126.     steps += 5;          
  127.     if (steps > production.length()) {
  128.       steps = production.length();
  129.     }
  130.     for (int i = 0; i < steps; i++) {
  131.       char step = production.charAt(i);
  132.       if (step == 'F') {
  133.         rect(0, 0, -drawLength, -drawLength);
  134.         noFill();
  135.         translate(0, -drawLength);
  136.       }
  137.       else if (step == '+') {
  138.         rotate(theta);
  139.       }
  140.       else if (step == '-') {
  141.         rotate(-theta);
  142.       }
  143.       else if (step == '[') {
  144.         pushMatrix();
  145.       }
  146.       else if (step == ']') {
  147.         popMatrix();            
  148.       }
  149.     }
  150.   }
  151.  
  152.   void simulate(int gen) {
  153.     while (getAge() < gen) {
  154.       production = iterate(production, rule);
  155.     }
  156.   }
  157.  
  158.   String iterate(String prod_, String rule_) {
  159.     drawLength = drawLength * 0.6;
  160.     generations++;
  161.     String newProduction = prod_;          
  162.     newProduction = newProduction.replaceAll("F", rule_);
  163.     return newProduction;
  164.   }
  165. }

См.также

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

  1. processing.org - Pentigree L-System by Geraldine Sarmiento.