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

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

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


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

Контакты:

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


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


Описание[1]

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

Пример

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

См.также

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

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