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

Processing:Примеры/L-система в виде мозаики Пенроуза

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


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

Контакты:

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


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


Описание[1]

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

Пример

  1. PenroseLSystem ds;
  2.  
  3. void setup() {
  4.   size(640, 360);
  5.   ds = new PenroseLSystem();
  6.   ds.simulate(4);
  7. }
  8.  
  9. void draw() {
  10.   background(0);
  11.   ds.render();
  12. }
  13.  
  14. class LSystem
  15. {
  16.   int steps = 0;
  17.  
  18.   String axiom;
  19.   String rule;
  20.   String production;
  21.  
  22.   float startLength;
  23.   float drawLength;
  24.   float theta;
  25.  
  26.   int generations;
  27.  
  28.   LSystem() {
  29.     axiom = "F";
  30.     rule = "F+F-F";
  31.     startLength = 190.0;
  32.     theta = radians(120.0);
  33.     reset();
  34.   }
  35.  
  36.   void reset() {
  37.     production = axiom;
  38.     drawLength = startLength;
  39.     generations = 0;
  40.   }
  41.  
  42.   int getAge() {
  43.     return generations;
  44.   }
  45.  
  46.   void render() {
  47.     translate(width/2, height/2);
  48.     steps += 5;          
  49.     if (steps > production.length()) {
  50.       steps = production.length();
  51.     }
  52.     for (int i = 0; i < steps; i++) {
  53.       char step = production.charAt(i);
  54.       if (step == 'F') {
  55.         rect(0, 0, -drawLength, -drawLength);
  56.         noFill();
  57.         translate(0, -drawLength);
  58.       }
  59.       else if (step == '+') {
  60.         rotate(theta);
  61.       }
  62.       else if (step == '-') {
  63.         rotate(-theta);
  64.       }
  65.       else if (step == '[') {
  66.         pushMatrix();
  67.       }
  68.       else if (step == ']') {
  69.         popMatrix();            
  70.       }
  71.     }
  72.   }
  73.  
  74.   void simulate(int gen) {
  75.     while (getAge() < gen) {
  76.       production = iterate(production, rule);
  77.     }
  78.   }
  79.  
  80.   String iterate(String prod_, String rule_) {
  81.     drawLength = drawLength * 0.6;
  82.     generations++;
  83.     String newProduction = prod_;          
  84.     newProduction = newProduction.replaceAll("F", rule_);
  85.     return newProduction;
  86.   }
  87. }
  88.  
  89.  
  90.  
  91. class PenroseLSystem extends LSystem {
  92.  
  93.   int steps = 0;
  94.   float somestep = 0.1;
  95.   String ruleW;
  96.   String ruleX;
  97.   String ruleY;
  98.   String ruleZ;
  99.  
  100.   PenroseLSystem() {
  101.     axiom = "[X]++[X]++[X]++[X]++[X]";
  102.     ruleW = "YF++ZF4-XF[-YF4-WF]++";
  103.     ruleX = "+YF--ZF[3-WF--XF]+";
  104.     ruleY = "-WF++XF[+++YF++ZF]-";
  105.     ruleZ = "--YF++++WF[+ZF++++XF]--XF";
  106.     startLength = 460.0;
  107.     theta = radians(36);  
  108.     reset();
  109.   }
  110.  
  111.   void useRule(String r_) {
  112.     rule = r_;
  113.   }
  114.  
  115.   void useAxiom(String a_) {
  116.     axiom = a_;
  117.   }
  118.  
  119.   void useLength(float l_) {
  120.     startLength = l_;
  121.   }
  122.  
  123.   void useTheta(float t_) {
  124.     theta = radians(t_);
  125.   }
  126.  
  127.   void reset() {
  128.     production = axiom;
  129.     drawLength = startLength;
  130.     generations = 0;
  131.   }
  132.  
  133.   int getAge() {
  134.     return generations;
  135.   }
  136.  
  137.   void render() {
  138.     translate(width/2, height/2);
  139.     int pushes = 0;
  140.     int repeats = 1;
  141.     steps += 12;          
  142.     if (steps > production.length()) {
  143.       steps = production.length();
  144.     }
  145.  
  146.     for (int i = 0; i < steps; i++) {
  147.       char step = production.charAt(i);
  148.       if (step == 'F') {
  149.         stroke(255, 60);
  150.         for (int j = 0; j < repeats; j++) {
  151.           line(0, 0, 0, -drawLength);
  152.           noFill();
  153.           translate(0, -drawLength);
  154.         }
  155.         repeats = 1;
  156.       }
  157.       else if (step == '+') {
  158.         for (int j = 0; j < repeats; j++) {
  159.           rotate(theta);
  160.         }
  161.         repeats = 1;
  162.       }
  163.       else if (step == '-') {
  164.         for (int j =0; j < repeats; j++) {
  165.           rotate(-theta);
  166.         }
  167.         repeats = 1;
  168.       }
  169.       else if (step == '[') {
  170.         pushes++;            
  171.         pushMatrix();
  172.       }
  173.       else if (step == ']') {
  174.         popMatrix();
  175.         pushes--;
  176.       }
  177.       else if ( (step >= 48) && (step <= 57) ) {
  178.         repeats = (int)step - 48;
  179.       }
  180.     }
  181.  
  182.     // Unpush if we need too
  183.     while (pushes > 0) {
  184.       popMatrix();
  185.       pushes--;
  186.     }
  187.   }
  188.  
  189.   String iterate(String prod_, String rule_) {
  190.     String newProduction = "";
  191.     for (int i = 0; i < prod_.length(); i++) {
  192.       char step = production.charAt(i);
  193.       if (step == 'W') {
  194.         newProduction = newProduction + ruleW;
  195.       }
  196.       else if (step == 'X') {
  197.         newProduction = newProduction + ruleX;
  198.       }
  199.       else if (step == 'Y') {
  200.         newProduction = newProduction + ruleY;
  201.       }  
  202.       else if (step == 'Z') {
  203.         newProduction = newProduction + ruleZ;
  204.       }
  205.       else {
  206.         if (step != 'F') {
  207.           newProduction = newProduction + step;
  208.         }
  209.       }
  210.     }
  211.  
  212.     drawLength = drawLength * 0.5;
  213.     generations++;
  214.     return newProduction;
  215.   }
  216.  
  217. }

См.также

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

  1. processing.org - Penrose Tile L-System by Geraldine Sarmiento.