📄 raster.as
字号:
/**
*
*
* 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 + -