
PDE Download: SimpleStructureTurtleB.pde
JAVA Download: SimpleStructureTurtleB.java
Click on anar+ terms to get the documentation.
import processing.opengl.*;
import anar.*;
import java.util.*;
import lsys.Grammar;
/*
* Example for Anar library by Guillaume LaBelle + Julien Nembrini
* http://anar.ch
*/
Pts ptsA = new Pts();
Face f;
Grammar grammar;
Obj faces;
Obj lines;
Transform T;
Translate t;
Transform r;
Scale s;
Sliders mySlider;
void setup(){
size(800,400,OPENGL);
Anar.init(this);
initGrammar();
initForm();
interpretGrammar();
}
void initGrammar(){
grammar = new Grammar("fg");
// here define the rules
// * means any kind of symbol
// the example rules below are therefore non contextual
grammar.addRule("*f*","fg[gf][hfh]");
grammar.addRule("*g*","gg[hif]");
grammar.addRule("*h*","ghjh");
grammar.addRule("*j*","[gifh]");
// this one makes it context dependant
grammar.addRule("igh","[ghfg]");
println(grammar);
}
void initForm(){
faces = new Obj();
Param pvRx = new Param(1.0f,0,3.14f,"rotate X");
Param pvRy = new Param(2.0f,0,3.14f,"rotate Y");
Param pvRz = new Param(3.0f,0,3.14f,"rotate Z");
r = new Transform();
RotateX rx = new RotateX(pvRx);
RotateY ry = new RotateY(pvRy);
RotateZ rz = new RotateZ(pvRz);
r.add(rx);
r.add(ry);
r.add(rz);
Param pvTx = new Param(00,0,100,"translate");
Param pvTy = new Param(0,0,10,"translate");
Param pvTz = new Param(10,0,100,"translate");
t = new Translate(Anar.Pt(pvTx,pvTy,pvTz));
Param pvSx = new Param(0.99f,0,10,"scale X");
Param pvSy = new Param(0.99f,0,10,"scale Y");
Param pvSz = new Param(0.99f,0,10,"scale Z");
s = new Scale(Anar.Pt(pvSx,pvSy,pvSz));
T = new Transform();
T.add(t);
}
void interpretGrammar(){
faces = new Obj();
lines = new Obj();
Face seedFace = new Star(40,50,6);
Face currentFace = seedFace;
Pts stackA = new Pts();
int indexA = 0;
Pt turtleA = seedFace.pt(indexA);
ArrayList stackPtsA = new ArrayList();
Pts ptsCollectorA = new Pts();
ptsCollectorA.add(turtleA);
Pts stackB = new Pts();
int indexB = seedFace.numOfPts()/3;
Pt turtleB = seedFace.pt(indexB);
ArrayList stackPtsB = new ArrayList();
Pts ptsCollectorB = new Pts();
ptsCollectorB.add(turtleB);
Pts stackC = new Pts();
int indexC = (2*seedFace.numOfPts())/3;
Pt turtleC = seedFace.pt(indexC);
ArrayList stackPtsC = new ArrayList();
Pts ptsCollectorC = new Pts();
ptsCollectorC.add(turtleC);
Iterator it = grammar.getSentence().iterator();
while (it.hasNext()){
String str = (String)it.next();
switch(str.charAt(0)){
case 'f':
// create translated copy from current face
Pts pts = new Pts();
Iterator itFace = currentFace.iterator();
while (itFace.hasNext()){
pts.add(Anar.Pt((Pt)itFace.next(),t));
}
Face f = new Face(pts);
// TODO (1) add size() method to Face
// TODO (1) transform the face (missing methods)
faces.add(f);
// move the turtle to the next face
currentFace = f;
indexA %= currentFace.numOfPts();
turtleA = currentFace.pt(indexA);
indexB %= currentFace.numOfPts();
turtleB = currentFace.pt(indexB);
indexC %= currentFace.numOfPts();
turtleC = currentFace.pt(indexC);
case 'g':
indexA = (indexA+1)%currentFace.numOfPts();
turtleA = currentFace.pt(indexA);
indexB = (indexB+1)%currentFace.numOfPts();
turtleB = currentFace.pt(indexB);
indexC = (indexC+1)%currentFace.numOfPts();
turtleC = currentFace.pt(indexC);
break;
case 'h':
indexA = (indexA+currentFace.numOfPts()-1)%currentFace.numOfPts();
turtleA = currentFace.pt(indexA);
indexB = (indexB+currentFace.numOfPts()-1)%currentFace.numOfPts();
turtleB = currentFace.pt(indexB);
indexC = (indexC+currentFace.numOfPts()-1)%currentFace.numOfPts();
turtleC = currentFace.pt(indexC);
break;
case 'i':
indexA = (indexA+2)%currentFace.numOfPts();
turtleA = currentFace.pt(indexA);
indexB = (indexB+2)%currentFace.numOfPts();
turtleB = currentFace.pt(indexB);
indexC = (indexC+2)%currentFace.numOfPts();
turtleC = currentFace.pt(indexC);
break;
case 'j':
indexA = (indexA+currentFace.numOfPts()-2)%currentFace.numOfPts();
turtleA = currentFace.pt(indexA);
indexB = (indexB+currentFace.numOfPts()-2)%currentFace.numOfPts();
turtleB = currentFace.pt(indexB);
indexC = (indexC+currentFace.numOfPts()-2)%currentFace.numOfPts();
turtleC = currentFace.pt(indexC);
break;
case '[':
stackA.add(turtleA);
stackPtsA.add(ptsCollectorA);
ptsCollectorA = new Pts();
ptsCollectorA.add(turtleA);
stackB.add(turtleB);
stackPtsB.add(ptsCollectorB);
ptsCollectorB = new Pts();
ptsCollectorB.add(turtleB);
stackC.add(turtleC);
stackPtsC.add(ptsCollectorC);
ptsCollectorC = new Pts();
ptsCollectorC.add(turtleC);
break;
case ']':
ptsCollectorA.add(turtleA);
turtleA = stackA.remove(stackA.size()-1);
lines.add(ptsCollectorA);
ptsCollectorA = (Pts)stackPtsA.remove(stackPtsA.size()-1);
ptsCollectorB.add(turtleB);
turtleB = stackB.remove(stackB.size()-1);
lines.add(ptsCollectorB);
ptsCollectorB = (Pts)stackPtsB.remove(stackPtsB.size()-1);
ptsCollectorC.add(turtleC);
turtleC = stackC.remove(stackC.size()-1);
lines.add(ptsCollectorC);
ptsCollectorC = (Pts)stackPtsC.remove(stackPtsC.size()-1);
break;
default:
break;
}
}
lines.pts.render = new RenderPtsLine(new AColor(128));
Anar.camTarget(faces);
mySlider = new Sliders(lines);
}
void draw(){
if(frameCount%2==0)
background(155);
else
background(153);
// faces.draw();
lines.draw();
mySlider.draw();
}
void keyPressed(){
if(key=='a'){
grammar.step();
println(grammar);
interpretGrammar();
}
if(key=='s'){
grammar.reset();
println(grammar);
interpretGrammar();
}
}

|