⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 raster.as

📁 flex3d 的源码
💻 AS
📖 第 1 页 / 共 2 页
字号:
/**
*
*
*	Raster class
*	
*	@author		Didier Brun aka Foxy - www.foxaweb.com
*	@version		1.3
* 	@date 		2006-01-06
* 	@link		http://www.foxaweb.com
* 
* 	AUTHORS ******************************************************************************
* 
*	authorName : 	Didier Brun - www.foxaweb.com
* 	contribution : 	the original class
* 	date :			2007-01-07
* 
* 	authorName :	Drew Cummins - http://blog.generalrelativity.org
* 	contribution :	added bezier curves
* 	date :			2007-02-13
* 
* 	authorName :	Empty
* 	do :
* 	date :	
* 
* 	PLEASE CONTRIBUTE ? http://www.bytearray.org/?p=67
* 
* 
* 	DESCRIPTION **************************************************************************
* 
* 	Raster is an AS3 Bitmap drawing library. It provide some function to draw directly 
* 	into BitmapData instance.
*
*	LICENSE ******************************************************************************
* 
* 	This class is under RECIPROCAL PUBLIC LICENSE.
* 	http://www.opensource.org/licenses/rpl.php
* 
* 	Please, keep this header and the list of all authors
* 
*/
package engine.utils
{

	import flash.display.BitmapData;
	import flash.utils.ByteArray;
	import flash.geom.Rectangle;
		
	public class Raster {
		
		// ------------------------------------------------
		//
		// ---o public static methods
		//
		// ------------------------------------------------
		
		/**
		* Draw a line
		* 
		* @param bmp	bitmap to draw (alpha=true)
		* @param x0		first point x coord
		* @param y0		first point y coord 
		* @param x1		second point x coord
		* @param y1		second point y coord
		* @param c		color (0xaarrvvbb)
		*/
		public static function line(bmp:BitmapData,x0:int,y0:int,x1:int,y1:int,c:Number):void{
			
			var dx:int;
			var dy:int;
			var i:int;
			var xinc:int;
			var yinc:int;
			var cumul:int;
			var x:int;
			var y:int;
			x = x0;
			y = y0;
			dx = x1 - x0;
			dy = y1 - y0;
			xinc = ( dx > 0 ) ? 1 : -1;
			yinc = ( dy > 0 ) ? 1 : -1;
			dx = Math.abs(dx);
			dy = Math.abs(dy);
			bmp.setPixel32(x,y,c);
			
			if ( dx > dy ){
				cumul = dx / 2 ;
		  		for ( i = 1 ; i <= dx ; i++ ){
					x += xinc;
					cumul += dy;
					if (cumul >= dx){
			  			cumul -= dx;
			  			y += yinc;
					}
					bmp.setPixel32(x,y,c);
				}
			}else{
		  		cumul = dy / 2;
		  		for ( i = 1 ; i <= dy ; i++ ){
					y += yinc;
					cumul += dx;
					if ( cumul >= dy ){
			  			cumul -= dy;
			  			x += xinc ;
					}
					bmp.setPixel32(x,y,c);
				}
			}
		}
		
		/**
		* Draw a triangle
		* 
		* @param bmp 	Bitmap to draw
		* @param x0		first point x coord
		* @param y0		first point y coord 
		* @param x1		second point x coord
		* @param y1		second point y coord
		* @param x2		third point x coord
		* @param y2		third point y coord
		* @param c		color (0xaarrvvbb)
		*/
		
		public static function triangle(bmp:BitmapData,x0:int,y0:int,x1:int,y1:int,x2:int,y2:int,c:Number):void{
			line (bmp,x0,y0,x1,y1,c);
			line (bmp,x1,y1,x2,y2,c);
			line (bmp,x2,y2,x0,y0,c);
		}
		
		/**
		* Draw a filled triangle
		* 
		* @param bmp 	Bitmap to draw
		* @param x0		first point x coord
		* @param y0		first point y coord 
		* @param x1		second point x coord
		* @param y1		second point y coord
		* @param x2		third point x coord
		* @param y2		third point y coord
		* @param c		color (0xaarrvvbb)
		*/
		public static function filledTri(bmp:BitmapData,x0:int,y0:int,x1:int,y1:int,x2:int,y2:int,c:Number):void{
			var o:Object={};
			lineTri (o,bmp,x0,y0,x1,y1,c);
			lineTri (o,bmp,x1,y1,x2,y2,c);
			lineTri (o,bmp,x2,y2,x0,y0,c);
		}
		
		
		/**
		* Draw a circle
		* 
		* @param bmp	bitmap to draw (alpha=true)
		* @param px		first point x coord
		* @param py		first point y coord 
		* @param r		radius
		* @param c		color (0xaarrvvbb)
		*/
		public static function circle(bmp:BitmapData,px:int,py:int,r:int,c:Number):void{
			var x:int;
			var y:int;
			var d:int;
			x = 0;
			y = r;
			d = 1-r;
			bmp.setPixel32(px+x,py+y,c);
			bmp.setPixel32(px+x,py-y,c);
			bmp.setPixel32(px-y,py+x,c);
			bmp.setPixel32(px+y,py+x,c);
			
			while ( y > x ){
				if ( d < 0 ){
					d += 2 * x+3 ;
				}else{
					d += 2 * (x - y)+5;
					y--;
				}
				x++;
				bmp.setPixel32(px+x,py+y,c);
				bmp.setPixel32(px-x,py+y,c);
				bmp.setPixel32(px+x,py-y,c);
				bmp.setPixel32(px-x,py-y,c);
				bmp.setPixel32(px-y,py+x,c);
				bmp.setPixel32(px-y,py-x,c);
				bmp.setPixel32(px+y,py-x,c);
				bmp.setPixel32(px+y,py+x,c);
			}
		}
		
		/**
		* Draw an anti-aliased circle
		* 
		* @param bmp	bitmap to draw (alpha=true)
		* @param px		first point x coord
		* @param py		first point y coord 
		* @param r		radius
		* @param c		color (0xaarrvvbb)
		*/
		public static function aaCircle(bmp:BitmapData,px:Number,py:Number,r:int,c:Number):void{
			var vx:int;
			var vy:int;
			var d:int;
			vx = r;
			vy = 0;
			
			var t:Number=0;
			var dry:Number;
			var _sqrt:Function=Math.sqrt;
			var _ceil:Function=Math.ceil;
				
			bmp.setPixel(px+vx,py+vy,c);
			bmp.setPixel(px-vx,py+vy,c);
			bmp.setPixel(px+vy,py+vx,c);
			bmp.setPixel(px+vy,py-vx,c);
				
			while ( vx > vy+1 ){
				vy++;
				dry=_ceil(_sqrt(r*r-vy*vy))-_sqrt(r*r-vy*vy);
				
				if (dry<t)vx--;
				
				drawAlphaPixel(bmp,px+vx,py+vy,1-dry,c)
				drawAlphaPixel(bmp,px+vx-1,py+vy,dry,c)
				drawAlphaPixel(bmp,px-vx,py+vy,1-dry,c)
				drawAlphaPixel(bmp,px-vx+1,py+vy,dry,c)
				drawAlphaPixel(bmp,px+vx,py-vy,1-dry,c)
				drawAlphaPixel(bmp,px+vx-1,py-vy,dry,c)
				drawAlphaPixel(bmp,px-vx,py-vy,1-dry,c)
				drawAlphaPixel(bmp,px-vx+1,py-vy,dry,c)
			
				drawAlphaPixel(bmp,px+vy,py+vx,1-dry,c)
				drawAlphaPixel(bmp,px+vy,py+vx-1,dry,c)
				drawAlphaPixel(bmp,px-vy,py+vx,1-dry,c)
				drawAlphaPixel(bmp,px-vy,py+vx-1,dry,c)
				
				
				drawAlphaPixel(bmp,px+vy,py-vx,1-dry,c)
				drawAlphaPixel(bmp,px+vy,py-vx+1,dry,c)
				drawAlphaPixel(bmp,px-vy,py-vx,1-dry,c)
				drawAlphaPixel(bmp,px-vy,py-vx+1,dry,c)
				
				t=dry;
			
			}
		}
		
		/**
		* Draw an anti-aliased line
		* 
		* @param bmp	bitmap to draw (alpha=true)
		* @param x0		first point x coord
		* @param y0		first point y coord 
		* @param x1		second point x coord
		* @param y1		second point y coord
		* @param c		color (0xaarrvvbb)
		*/
		public static function aaLine(bmp:BitmapData,x1:int,y1:int,x2:int,y2:int,c:Number):void{
			
			var steep:Boolean= Math.abs(y2 - y1) > Math.abs(x2 - x1);
			var swap:int;
			
			if (steep){
				swap=x1; x1=y1; y1=swap;
				swap=x2; x2=y2; y2=swap;
			}
			if (x1 > x2){
				swap=x1; x1=x2; x2=swap;
				swap=y1; y1=y2; y2=swap;
			}
    
			var dx:int = x2 - x1;
			var dy:int = y2 - y1
			
			var gradient:Number = dy / dx;

			var xend:int = x1;
			var yend:Number = y1 + gradient * (xend - x1);
			var xgap:Number = 1-((x1 + 0.5)%1);
			var xpx1:int = xend;
			var ypx1:int = Math.floor(yend);
			var alpha:Number;
			
			alpha=(1-((yend)%1))*xgap;
			
			if (steep){
				//drawAlphaPixel(bmp,ypx1,xpx1,alpha,c);	
			}else{
				//drawAlphaPixel(bmp,xpx1, ypx1,alpha,c);
			}
			alpha=((yend)%1)*xgap;
			if (steep){
				//drawAlphaPixel(bmp,ypx1+1,xpx1,alpha,c);
			}else{
				//drawAlphaPixel(bmp,xpx1, ypx1+1,alpha,c);
			}
			
		
			var intery:Number = yend + gradient;

			xend = x2;
			yend = y2 + gradient * (xend - x2)
			xgap = (x2 + 0.5)%1;
			
			var xpx2:int = xend; 
			var ypx2:int = Math.floor(yend);
			
			alpha=(1-((yend)%1))*xgap;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -