import processing.opengl.*; import anar.*; /* * Example for Anar library by Guillaume LaBelle + Julien Nembrini * http://anar.ch */ boolean isTracing = true; Pts trace = new Pts(); Pt tip; void setup(){ size(1200,800,OPENGL); Anar.chy(this); Anar.drawAxis(true); mechObj.rotateX((float)Math.PI/2); trace.render = new RenderPtsLineDotted(new AColor(255,40,50)); Obj lastPart = new Obj(); Pts l = new Pts(); l.add(Anar.Pt(0,0, -10)); l.add(Anar.Pt(0,0,0)); l.add(Anar.Pt(10,0,0)); lastPart.add(l); for (int i = 0; i<5; i++){ Obj part = new Obj(); // Add previous part part.add(lastPart); // Place the new part in the direction previous part // It is inverted! Pts axis = lastPart.lineEnd(); Param z = new Param(0, -PI*2,PI*2); Anar.sliders.add(z); Obj tmp = createDurerPart(); tmp.rotateX(alph); Transform position = new Transform(axis.pt(2),axis.pt(0),axis.pt(1)).rotateY(z); position.postTransform = false; tmp.apply(position); // This part is oriented, then add it to the new part part.add(tmp); lastPart = part; } tip = lastPart.lineEnd().pt(2); Anar.add(lastPart); } int id; Param wi = new Param( -10); Param alph = new Param(PI/2); Face mechObj = new Star(5,2,10); Obj createDurerPart(){ Pt origin = Anar.Pt(0,0,0); Param t = new Param(3+id*0.01f,0,200); Param w = new Param(100/ (id+1),0,100); // Param r = new ParamCycle(0, -PI*2,PI*2,t); Param r = new Param(0, -PI*2,PI*2); // Anar.sliders.add(t); // Anar.sliders.add(w); Anar.sliders.add(r); Obj part = new Obj(); Pt head = Anar.Pt(origin); head.translateZ(w); Pt tail = Anar.Pt(origin); tail.translateZ(wi); Pt rd3 = Anar.Pt(origin); rd3.translateX( -10); Obj headO = new Cone(1,10); headO.translateZ( -10); headO.translate(head); part.add(headO); Face mech = new Face(mechObj); mech.rotateZ(0); part.add(mech); Pts l = new Pts(); l.add(rd3); l.add(tail); l.add(head); l.stroke(160); part.add(l); part.rotateY(r); // This one is ok id++; return part; } void draw(){ background(200); Anar.main.draw(); if(isTracing) if(trace.numOfPts()==0|| !tip.equalsPt(trace.ptEnd())) trace.add(Anar.Pt(tip.x(),tip.y(),tip.z())); trace.draw(); } void keyPressed(){ isTracing = (isTracing) ? false:true; println(isTracing); }