Blog der Heimetli Software AG

Die Koch-Kurve

Passend zur Saison habe ich die fraktale "Schneeflocke" von Helge Koch in JavaScript implementiert.

Das Script dazu

const animation = {
   level: -1,
   step: 1,

   generate: function( ctx, level, sx, sy, ex, ey )
   {
      // Terminate the recursion
      if( level == 0 )
      {
         ctx.lineTo( ex, ey ) ;
      }
      else
      {
         // Compute the intermediate points
         let rex = sx + (ex - sx) / 3 ;
         let rey = sy + (ey - sy) / 3 ;
         let rsx = ex - (ex - sx) / 3 ;
         let rsy = ey - (ey - sy) / 3 ;
         let px  = (rsx + rex) / 2 + 0.866 * (rey - rsy) ;
         let py  = (rsy + rey) / 2 - 0.866 * (rex - rsx) ;

	 // Draw the segments recursively
         this.generate( ctx, level-1, sx,  sy,  rex, rey ) ;
         this.generate( ctx, level-1, rex, rey, px,  py  ) ;
         this.generate( ctx, level-1, px,  py,  rsx, rsy ) ;
         this.generate( ctx, level-1, rsx, rsy, ex,  ey  ) ;
      }
   },

   draw: function()
   {
      // Get the graphics context
      const canvas = document.getElementById( "canvas" ) ;
      const ctx    = canvas.getContext( "2d" ) ;  

      // Adjust the level
      this.level = this.level + this.step ;

      if( this.level == 0 )
         this.step = 1 ;

      if( this.level == 6 )
         this.step = -1 ;

      // Clear the background
      ctx.fillStyle = "#C0C0C0" ;
      ctx.fillRect( 0, 0, 600, 700 ) ;

      // Draw the snowflake
      ctx.beginPath() ;
      ctx.moveTo( 4, 516 )
      this.generate( ctx, this.level,   4, 516, 595, 516 ) ;
      this.generate( ctx, this.level, 595, 516, 300,   4 ) ;
      this.generate( ctx, this.level, 300,   4,   4, 516 ) ;

      ctx.fillStyle = "#FFFFFF" ;
      ctx.fill() ;
      ctx.stroke() ;
   }  
}

window.addEventListener( "load", event => {
   const draw = animation.draw.bind( animation ) ;

   draw() ;
   setInterval( draw, 1200 ) ;
} ) ;