Bred Kakoita

by WLAD
♥0 | Line 225 | Modified 2014-06-22 04:47:37 | MIT License
play

ActionScript3 source code

/**
 * Copyright WLAD ( http://wonderfl.net/user/WLAD )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/jpBN
 */

package
{
	import flash.display.Shape;
	import flash.display.Sprite;
	
	public class FlashTest extends Sprite
	{
		private var gird:Gird;
		
		private var convas:Shape;
		
		public function FlashTest()
		{
			// write as3 code here..
			
			var sx:Number = stage.stageWidth / 2;
			var sy:Number = stage.stageHeight / 2;
			
			gird = new Gird(20);
			
			convas = new Shape();
			convas.graphics.lineStyle(3, 0xFF0000, 0.5);
			convas.x = sx;
			convas.y = sy;
			
			addChild(convas);
			
			gird.draw(convas.graphics, 3
			);
		}
	
	}
}
import flash.display.Graphics;
import flash.geom.Point;
import flash.text.TextField;
import flash.text.TextFormat;

class Hexagon
{
	private var _x:int;
	private var _y:int;
	private var _z:int;
	
	public var neighbors:Vector.<Hexagon>;
	
	public function Hexagon(x:int = 0, y:int = 0, z:int = 0)
	{
		_x = x;
		_y = y;
		_z = z;
		
		neighbors = new Vector.<Hexagon>();
	}
	
	public function connect(neighbor:Hexagon):void
	{
		neighbors.push(neighbor);
	}
	
	public function add( h:Hexagon ):void
	{
		_x += h.x;
		_y += h.y;
		_z += h.z;
	}
	
	public function clone():Hexagon 
	{
		return new Hexagon( _x, _y, _z );
	}
	
	public function get x():int 
	{
		return _x;
	}
	
	public function set x(value:int):void 
	{
		_x = value;
	}
	
	public function get y():int 
	{
		return _y;
	}
	
	public function set y(value:int):void 
	{
		_y = value;
	}
	
	public function get z():int {return _z;}
	
	public function set z(value:int):void 
	{
		_z = value;
	}
}

class Gird
{
	private var _flat:Boolean;
	private var _size:Number = 0;
	
	public function Gird(size:Number, flat:Boolean = true)
	{
		_flat = flat;
		_size = size;
	}
	
	private var _width:Number = 0;public function get width():Number
	{
		if (_width == 0)
			_width = _flat ? _size * 2 : 0;
		return _width;
	}
	
	private var _height:Number = 0;public function get height():Number
	{
		if (_height == 0)
			_height = _flat ? Math.sqrt(3) / 2 * width : 0;
		return _width;
		
	}
	
	private var _distH:Number = 0;public function get distH():Number
	{
		if (_distH == 0)
			_distH = _flat ? 3 / 4 * width : 0;
		return _distH;
	}
	
	private var _distV:Number = 0;public function get distV():Number
	{
		if (_distV == 0)
			_distV = _flat ? height : 0;
		return _distV;
	}
	
	public function draw(g:Graphics, radius:uint):void
	{
		
		/// Zero
		var origin:Hexagon = new Hexagon(); 
		
		drawHexagon( g, origin );
		
		var drawOnNewHex:Function = 
		function( h:Hexagon ):void {
			drawHexagon( g, h );
		};
		
		populate( 2, radius, origin, drawOnNewHex );
		populate( 4, radius, origin, drawOnNewHex );
		populate( 6, radius, origin, drawOnNewHex );
		
	}
	
	public function populate( direction:uint, ttl:int = 1, origin:Hexagon = null, onNew:Function = null):void //, populateLeft:int = 1, populateRight:int = 0):void
	{
		// Prevent stack overflow
		if ( ttl <= 0 ) return;
		
		var o:Hexagon = origin.clone();
		o.add( this.direction( direction ) );
		//o.connect( origin );
		//if( leftConnect ) if( o is most left ) o.connect( leftConnect )
		if ( onNew != null ) onNew( o );
		populate( direction, ttl - 1, o, onNew);
		
		// if( populateLeft > 0 ) ...
		
		o = origin.clone();
		o.add( this.direction( direction - 1 ) );
		if ( onNew != null ) onNew( o );
		populate( direction - 1, ttl - 1, o, onNew);
	}
	
	public function cartesianCoords( h:Hexagon ):Point
	{
		var p:Point = new Point();
		p.x = width * h.x;
		p.y = _size * h.x + _size * h.y;
		return p;
	}
	
	public function direction(dir:uint):Hexagon
	{
		while ( dir > 5 ) dir -= 6;		while ( dir < 0 ) dir += 6;
		
		switch( dir )
		{
			case 0:		return new Hexagon(  0, -1,  1 );	break;
			case 1:		return new Hexagon(  1, -1,  0 );	break;
			case 2:		return new Hexagon(  1,  0, -1 );	break;
			case 3:		return new Hexagon(  0,  1, -1 );	break;
			case 4:		return new Hexagon( -1,  1,  0 );	break;
			case 5:		return new Hexagon( -1,  0,  1 );	break;
		}
		
		// imposible return
		return null;
	}
	
	private function drawHexagon(g:Graphics, h:Hexagon):void
	{
		var p:Point = cartesianCoords( h );
		
		/*
		var x:Number = h.x * distH;
		var y:Number = 
		*/
		
		var v:Vec = new Vec(_size, 0);
		
		var a:Number = Math.PI / 3;
		
		g.moveTo(p.x + v.x, p.y + v.y);
		
		var n:int = 6;
		while (n-- > 0)
		{
			v.radians += a;
			g.lineTo(p.x + v.x, p.y + v.y);
		}
	}
}

class Vec
{
	public var x:Number, y:Number;
	
	public function Vec(x:Number = 0, y:Number = 0)
	{
		this.x = x;
		this.y = y;
	}
	
	public function get lenght():Number
	{
		return Math.sqrt(x * x + y * y);
	}
	
	public function set lenght(value:Number):void
	{
		if (lenght == 0)
			scale(0);
		else
			scale(value / lenght);
	}
	
	public function set degrees(value:Number):void
	{
		radians = value * Math.PI / 180;
	}
	
	public function get degrees():Number
	{
		return radians * 180 / Math.PI;
	}
	
	public function set radians(value:Number):void
	{
		var f:Number = lenght;
		x = Math.cos(value) * f;
		y = Math.sin(value) * f;
	}
	
	public function scale(n:Number):void
	{
		x *= n;
		y *= n;
	}
	
	public function get radians():Number
	{
		return Math.atan2(y, x);
	}

}

class T extends TextField
{
	public function T(digit:int)
	{
		var tf:TextFormat = new TextFormat("_sans", 12, 0x000000);
		this.setTextFormat(tf);
		this.defaultTextFormat = tf;
		this.autoSize = 'left';
		this.text = digit.toString();
		this.selectable = this.wordWrap = this.multiline = this.mouseEnabled = false;
		
		this.x = -this.width / 2;
		this.y = -this.height / 2;
	}

}

Forked