パーフェクトシャッフルは何回で戻るか
続: パーフェクトシャッフルは何回で元に戻るか - 西尾泰和のはてなダイアリーの件、以前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