Processing:Примеры/L-система в виде снежинки Пенроуза
Материал из Онлайн справочника
				
				
				Перейти к навигацииПерейти к поиску
				
				
| Содержание | Среда разработки Processing | Справочник языка Processing | Библиотеки | Примеры | Режимы программирования | 
Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.
Описание[1]
Этот код основан на классе LSystem, разработанном Патриком Дваером.
Пример
PenroseSnowflakeLSystem ps;
void setup() {
  size(640, 360);
  stroke(255);
  noFill();
  ps = new PenroseSnowflakeLSystem();
  ps.simulate(4);
}
void draw() {
  background(0);
  ps.render();
}
class PenroseSnowflakeLSystem extends LSystem {
  String ruleF;
  PenroseSnowflakeLSystem() {
    axiom = "F3-F3-F3-F3-F";
    ruleF = "F3-F3-F45-F++F3-F";
    startLength = 450.0;
    theta = radians(18); 
    reset();
  }
  void useRule(String r_) {
    rule = r_;
  }
  void useAxiom(String a_) {
    axiom = a_;
  }
  void useLength(float l_) {
    startLength = l_;
  }
  void useTheta(float t_) {
    theta = radians(t_);
  }
  void reset() {
    production = axiom;
    drawLength = startLength;
    generations = 0;
  }
  int getAge() {
    return generations;
  }
  void render() {
    translate(width, height);
    int repeats = 1;
    steps += 3;          
    if (steps > production.length()) {
      steps = production.length();
    }
    for (int i = 0; i < steps; i++) {
      char step = production.charAt(i);
      if (step == 'F') {
        for (int j = 0; j < repeats; j++) {
          line(0,0,0, -drawLength);
          translate(0, -drawLength);
        }
        repeats = 1;
      } 
      else if (step == '+') {
        for (int j = 0; j < repeats; j++) {
          rotate(theta);
        }
        repeats = 1;
      } 
      else if (step == '-') {
        for (int j =0; j < repeats; j++) {
          rotate(-theta);
        }
        repeats = 1;
      } 
      else if (step == '[') {
        pushMatrix();
      } 
      else if (step == ']') {
        popMatrix();
      } 
      else if ( (step >= 48) && (step <= 57) ) {
        repeats += step - 48;
      }
    }
  }
  String iterate(String prod_, String rule_) {
    String newProduction = "";
    for (int i = 0; i < prod_.length(); i++) {
      char step = production.charAt(i);
      if (step == 'F') {
        newProduction = newProduction + ruleF;
      } 
      else {
        if (step != 'F') {
          newProduction = newProduction + step;
        }
      }
    }
    drawLength = drawLength * 0.4;
    generations++;
    return newProduction;
  }
}
class LSystem 
{
  int steps = 0;
  String axiom;
  String rule;
  String production;
  float startLength;
  float drawLength;
  float theta;
  int generations;
  LSystem() {
    axiom = "F";
    rule = "F+F-F";
    startLength = 90.0;
    theta = radians(120.0);
    reset();
  }
  void reset() {
    production = axiom;
    drawLength = startLength;
    generations = 0;
  }
  int getAge() {
    return generations;
  }
  void render() {
    translate(width/2, height/2);
    steps += 5;          
    if (steps > production.length()) {
      steps = production.length();
    }
    for (int i = 0; i < steps; i++) {
      char step = production.charAt(i);
      if (step == 'F') {
        rect(0, 0, -drawLength, -drawLength);
        noFill();
        translate(0, -drawLength);
      } 
      else if (step == '+') {
        rotate(theta);
      } 
      else if (step == '-') {
        rotate(-theta);
      } 
      else if (step == '[') {
        pushMatrix();
      } 
      else if (step == ']') {
        popMatrix();            
      }
    }
  }
  void simulate(int gen) {
    while (getAge() < gen) {
      production = iterate(production, rule);
    }
  }
  String iterate(String prod_, String rule_) {
    drawLength = drawLength * 0.6;
    generations++;
    String newProduction = prod_;          
    newProduction = newProduction.replaceAll("F", rule_);
    return newProduction;
  }
}
См.также
Внешние ссылки
| Примеры на Processing | |
|---|---|
| Основы | 
 | 
| Продвинутые графические эффекты | 
 | 
| Примеры из сторонних библиотек | |
