• fullscreen
  • Fibo_Rider_mar18a.pde
  • int N = 6; // number of chords
    float speedown = 30;
    
    float Angles[] = new float[N];
    
    void setup(){
      size(200,200);
      background( 255);
      frameRate(25);
      smooth();
    }
    
    void draw() {
      state( makeL());
      /* Save frames for gif animation */
    //  if( (float)frameCount < 1 + TWO_PI * speedown) {
    //    saveFrame( "gifani/fr-####.png");
    //  } else {
    //    exit();
    //  }
    }
    
    float makeL(){
      return map( pow( sin( (float)frameCount/speedown), 3), -1, 1., .05, .380);
    }
    
    void state( float L) {
      /*
        Virtual circle has a Diameter == 1
        Chords length is always less that 1
        Fill in the Array of angles, starting at 0
        Each angle determines a joint.
      */
      float a = 0; // current Angle
      for( int i=0; i<N; i++){
        a += 2*asin(L * fibo(i));
        Angles[i] = a;
      }
      plot();
    }
    
    void plot(){ // draws that stuff on a particular circle sized to nicely fit the canvas
      PVector Curr, Prev;
      float a;
      background(255, 0);
      pushMatrix();
      translate( width/2, height/2);
      stroke(230); noFill(); strokeWeight(1);
      float D = .9*min(width, height);
      ellipse( 0, 0, D, D);
      line(-D/2, 0, D/2, 0);
      line(0, -D/2, 0, D/2);
      
      stroke(30,30,50); strokeWeight(2);
      Prev = new PVector(0,0);
      for( int i=0; i<N; i++){
        a = Angles[i];
        Curr = new PVector( .5*D*cos( a), -.5*D*sin( a) );
        if( i>0) line( Curr.x, Curr.y, Prev.x, Prev.y);
        Prev = Curr;
      }
      /* And now the joints circles */
      fill(255); strokeWeight(1);
      for( int i=0; i<N; i++){
        a = Angles[i];
        Curr = new PVector( .5*D*cos( a), -.5*D*sin( a) );
        ellipse( Curr.x, Curr.y, 6, 6);
      }
      popMatrix();
    }
    
    int fibo( int M){ // return Fibonacci number: 0,1,1,2,3,5,8.. Next is a sum o two previous.
      int Prev=0, Curr=1, Next=1;
      if( M<=0) return 0;
      if( M==1) return 1;
      for( int i=1; i<M; i++) {
        Next = Curr + Prev;
        Prev = Curr;
        Curr = Next;
      }
      return Next;  
    }
    
    

    code

    tweaks (0)

    about this sketch

    This sketch is running as Java applet, exported from Processing.

    license

    advertisement

    Sergei Sokolov

    Fibonacci glider

    Add to Faves Me Likey@!
    You must login/register to add this sketch to your favorites.

    Test to understand the geometry of chords succession, having lengths proportional to Fibonacci numbers: 1,1,2,3,5,8,13,21.. — next is a sum of two previous.
    Was looking for a way to make the sequence onf N chords to exactly close the loop, but couldn't solve the math equations yet : )
    Cube of sin(x) is used to animate chords lengths adjustment.

    You need to login/register to comment.