パーフェクトシャッフルは何回で戻るか
/**
* Copyright fn7 ( http://wonderfl.net/user/fn7 )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/oVSU
*/
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: 60 => num: 60
cards: 70 => num: 35
cards: 80 => num: 54
cards: 126 => 7
cards: 170 => 18
*/
var cards:int = 64 ;
var num:int = 12;
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();
var t:Number;
var rgb:Array;
for(var i:int=0;i<n;i++){
t = 5/3 * Math.PI * i / n;
rgb = [
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);
var line:Sprite;
var g:Graphics;
for(var c:int =0; c<cards; c++){
line = new Sprite;
addChild(line);
g = line.graphics;
start = {
num: c,
radius: minRadius + c * margin,
radian: 0
};
g.lineStyle(lineWidth,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;
}
}
}
}
}