パーフェクトシャッフルは何回で戻るか

続: パーフェクトシャッフルは何回で元に戻るか - 西尾泰和のはてなダイアリーの件、以前CanvasでやったのをActionScriptでもやってみた。
コードを読みなおすと、自分でもキモいなと思うところがいくつか発見(爆)

なので、できるだけ書き直してみた。


package {
  import flash.display.Sprite;
  import flash.display.BitmapData;
  import flash.display.Bitmap;
  import flash.display.Graphics;
  public class perfectshuffle extends Sprite{
    private static const WIDTH:Number = 465;
    private static const HEIGHT:Number = 465;
    private var num_shuffle:int;
    private var center:Object = {x:WIDTH/2,y:HEIGHT/2};
    private var lineWidth:int = 2;
    private var minRadius:Number = 20;
    private var margin:Number = 2;
    private var ctrlPointFactor:Number = 1;
    public function perfectshuffle(){
      var g:Graphics = graphics;
      g.beginFill(0x000000);
      g.drawRect(0,0,WIDTH,HEIGHT);
      g.endFill();
      /*
        cards: 10 => num: 10
        cards: 20 => num: 6
        cards: 30 => num: 5
        cards: 40 => num: 20
        cards: 50 => num: 8
        cards: 60 => num: 60
        cards: 70 => num: 35
        cards: 80 => num: 54
      */
      var cards:int = 50;
      var num:int = 8;
      ctrlPointFactor = 1 / Math.cos(2 * Math.PI / num / 2);
      margin = (WIDTH/2 - minRadius) / cards;
      init(cards,num);
    }
    private function color(n:int):Array{
      var color:Array = new Array();
      for(var i:int=0;i<n;i++){
        var t:Number = 5/3 * Math.PI * i / n;
        var rgb:Array = [
          255 * (Math.cos(t + 2 * Math.PI/3)),
          255 * (Math.cos(t + 4 * Math.PI/3)),
          255 * (Math.cos(t + 0 * Math.PI/3)),
        ];
        for(var c:int=0;c<3;c++){
          if(rgb[c] < 0){rgb[c] = 0;}
          if(255 < rgb[c]){rgb[c] = 255;}
          rgb[c] = Math.round(rgb[c]);
        }
        color.push(rgb[0] << 16 | rgb[1] << 8 | rgb[2])
      }
      return color;
    }

    private function init(cards:int,num:int):void{      
      var start:Object;
      var end:Object;
      var ctrlPoint:Object;
      var color:Array = color(cards);
      for(var c:int =0; c<cards; c++){
        var line:Sprite = new Sprite;
        addChild(line);
        var g:Graphics = line.graphics;
        start = {
          num: c,
          radius: minRadius + c * margin,
          radian: 0
        };
        g.lineStyle(2,color[c]);
        g.moveTo(start.radius * Math.cos(start.radian) + center.x,start.radius * Math.sin(start.radian) + center.y);
        for(var i:int = 0; i<num; i++){
          var n:int = start.num;
          if (n < Math.floor(cards/2)) {
            n = n + n + 1; // 2 (i + 1) - 1
          }else{
            n = n + n - cards; // 2 (i - n/2)
          }
          end = {
            num: n,
            radius: minRadius + n * margin,
            radian: (i + 1) * 2 * Math.PI / num
          };
          ctrlPoint = {
            radius: ctrlPointFactor * Math.max(start.radius,end.radius),
            radian: (i + 0.5) * 2 * Math.PI / num
          };
          g.curveTo(
            ctrlPoint.radius * Math.cos(ctrlPoint.radian) + center.x,ctrlPoint.radius * - Math.sin(ctrlPoint.radian) + center.y,
            end.radius * Math.cos(end.radian) + center.x,end.radius * - Math.sin(end.radian) + center.y
          );
          start = end;
        }
      }
    }
  }
}


[追記]
shuffle関数使ってないので削除w