This browser does not have a Java Plug-in.
Get the latest Java Plug-in here.

anar+

by   LaBelle + Nembrini
©2008

built with ( )
   examples index
Rotate: middle click or key[1]
Zoom in|out: wheel button or key[2]
AutoRotate: key[5]
(First Click inside the applet to enable keys)

This applet use OpenGL, you might have to install extra jogl libraries once to view this applet. You may have a look at image capture and video at the bottom of this page. You might accept security security permenently to remove the security prompts on each pages.



sourcecode


   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();
 
  }
}
 
 
 
 



screenshots