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 | |
---|---|
Основы |
|
Продвинутые графические эффекты |
|
Примеры из сторонних библиотек |