// forked from borealkiss's 毛ボール
// forked from ll_koba_ll's 3D Ball
package {
import flash.display.Sprite;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.geom.Matrix;
[SWF(width="465",height="465",backgroundColor="0x0")]
public class main extends Sprite{
private const STAGE_WIDTH:int = 465;
private const STAGE_HEIGHT:int = 465;
private const LIMIT:int = 10000;
private const HAIR_LENGTH:int = 100;
public function main(){
this.init();
}
private function init():void{
var canvasBitmapData:BitmapData = new BitmapData(STAGE_WIDTH,STAGE_HEIGHT,true,0x0);
var matrix:Matrix = new Matrix();
matrix.translate(STAGE_WIDTH/2,STAGE_HEIGHT/2);
canvasBitmapData.draw(new Ball3D(),matrix);
this.addChild(new Bitmap(canvasBitmapData));
var hair:Sprite = new Hair(canvasBitmapData,LIMIT,HAIR_LENGTH,0xFFFFFF);
this.addChild(hair);
}
}
}
import flash.display.*;
import flash.events.*;
import flash.geom.*;
class Ball3D extends Sprite{
public function Ball3D(){
init();
}
private function init():void{
var ball:Sprite = new Sprite();
var fillType:String = GradientType.RADIAL;
var colors:Array = [0xFFFFFF, 0x333333];
var alphas:Array = [1, 1];
var ratios:Array = [0x00, 0xFF];
var matr:Matrix = new Matrix();
matr.createGradientBox(-250, -250, Math.PI/2, 100, 80);
var spreadMethod:String = SpreadMethod.PAD;
var interpolation:String = InterpolationMethod.RGB;
ball.graphics.beginGradientFill(fillType, colors, alphas, ratios, matr, spreadMethod,interpolation);
ball.graphics.drawCircle(0,0,100);
addChild(ball);
}
}
import flash.display.Sprite;
import flash.display.Graphics;
import flash.display.BitmapData;
class Hair extends Sprite{
protected var _sourceBitmapData:BitmapData;
protected var _random:uint;
protected var _stroke:uint;
protected var _limit:uint;
protected var _alpha:Number;
/**
* Constructor
*/
public function Hair(sourceBitmapData:BitmapData,limit:uint,random:uint,stroke:uint=0x0,alpha:Number=0.1){
_sourceBitmapData = sourceBitmapData;
_limit = limit;
_random = random;
_stroke = stroke;
_alpha = alpha;
this.init();
}
protected function init():void{
var rectWidth:int = _sourceBitmapData.width;
var rectHeight:int = _sourceBitmapData.height;
var g:Graphics = this.graphics;
g.clear();
g.lineStyle(0,_stroke,_alpha);
for (var i:int=0; i<_limit; i++){
var x:int = int(Math.random()*rectWidth);
var y:int = int(Math.random()*rectHeight);
var color32:uint = _sourceBitmapData.getPixel32(x,y);
if (isInObject(color32)){
//Start point
var startX:Number = x;
var startY:Number = y;
//Anchor point so that the hair goes outer.
var hairRad:Number = _random*Math.random();
var hairTheta:Number = Math.random()*2*Math.PI;
var anchorX:Number = startX + hairRad*Math.cos(hairTheta);
var anchorY:Number = startY + hairRad*Math.sin(hairTheta);
//Control point for the Bezier curve.
var controlRad:Number = _random*Math.random();
var controlTheta:Number = Math.random()*2*Math.PI;
var controlX:Number = startX + controlRad*Math.cos(controlTheta);
var controlY:Number = startY + controlRad*Math.sin(controlTheta);
g.moveTo(startX,startY);
g.curveTo(controlX,controlY,anchorX,anchorY);
}
}
}
protected function isInObject(color32:uint):Boolean{
if (color32 == 0x0){
return false;
}
return true;
}
protected function randomGen(random:uint):Number{
return 2*random*(Math.random() - 1/2);
}
}