//绘图类 
import fc.graphics*; 
import fc.graphics.draw2d.AbstractDraw; 
class fc.graphics.draw2d.GDI { 
private var _target:MovieClip; 
//设置和获取绘图的目标 
public function get target() { 
return _target; 

public function set target(mc) { 
_target = mc; 


//画线方法 
public function line(p:Pen, d:AbstractDraw) { 
startPen(p); 
d.target = _target; 
d.draw(); 
endPen(); 


//填充方法 
public function fill(b:Brush, d:AbstractDraw) { 
startBrush(b); 
d.target = _target; 
d.draw(); 
endBrush(); 
}

private function startPen(p) { 
_target.lineStyle(p.width, p.color, p.alpha); 

private function endPen():Void { 
_target.lineStyle(null, null, null); 

private function startBrush(b:Brush) { 
b.fill(_target); 

private function endBrush() { 
_target.endFill(); 


//清除绘图方法
public function clear():Void { 
if (_target != null) { 
_target.clear(); 




//抽象画图类 
class fc.graphics.draw2d.AbstractDraw { 
private var _target:MovieClip; 
public function get target() { 
return _target; 

public function set target(mc) { 
_target = mc; 


//定义统一接口 
function draw(){



//画直线 
import fc.graphics.draw2d.AbstractDraw; 
class fc.graphics.draw2d.Line extends AbstractDraw { 
private var _x1:Number; 
private var _x2:Number; 
private var _y1:Number; 
private var _y2:Number; 
public function Line(x1:Number, y1:Number, x2:Number, y2:Number) { 
_x1 = x1; 
_x2 = x2; 
_y1 = y1; 
_y2 = y2; 


//绘制实直线 
public function draw(){ 
lineFunc(_x1, _y1, _x2, _y2); 


//绘制直线函数 
private function lineFunc(x1:Number, y1:Number, x2:Number, y2:Number) { 
_target.moveTo(x1, y1); 
_target.lineTo(x2, y2); 



//画矩形 
import fc.graphics.draw2d.AbstractDraw; 
class fc.graphics.draw2d.Rect extends AbstractDraw { 
private var _x:Number; 
private var _y:Number;
private var _w:Number; 
private var _h:Number; 
public function Rect(x:Number, y:Number, w:Number, h:Number) { 
_x = x; 
_y = y; 
_w = w; 
_h = h; 

public function draw() { 
rectFunc(_x, _y, _w, _h); 


//绘制矩形 
private function rectFunc(x:Number, y:Number, w:Number, h:Number) { 
_target.moveTo(x, y); 
_target.lineTo(x+w, y); 
_target.lineTo(x+w, y+h); 
_target.lineTo(x, y+h); 
_target.lineTo(x, y); 



//画正多边 
import fc.graphics.draw2d.AbstractDraw 
class fc.graphics.draw2d.Poly extends AbstractDraw { 
private var _x:Number; 
private var _y:Number; 
private var _r:Number; 
private var _n:Number; 
public function Poly(x:Number, y:Number, r:Number, n:Number) { 
_x = x; 
_y = y;
_r = r; 
_n = n; 

public function draw() { 
polyFunc(_x, _y, _r, _n); 


//绘制多边形 
private function polyFunc(x:Number, y:Number, r:Number, n:Number) { 
var pai = 2*Math.PI; 
_target.moveTo(r+x, y); 
for (var i = 0; i<pai/n*(n+1); i += pai/n) { 
_target.lineTo(Math.cos(i)*r+x, Math.sin(i)*r+y); 




//椭圆,圆 
import fc.graphics.draw2d.AbstractDraw; 
import fc.math.Degree; 
class fc.graphics.draw2d.Ellipse extends AbstractDraw { 
private var _x:Number; 
private var _y:Number; 
private var _rx:Number; 
private var _ry:Number; 
public function Ellipse(x:Number, y:Number, rx:Number, ry:Number) { 
_x = x; 
_y = y; 
_rx = rx; 
_ry = ry; 

public function draw() {
ellipseFunc(_x, _y, _rx, _ry); 


//绘制椭圆(圆)函数 
public function ellipseFunc(x:Number, y:Number, rx:Number, ry:Number) { 
if (ry == null) { 
ry = rx; 

var controlx = rx*(Math.SQRT2-1); 
var controly = ry*(Math.SQRT2-1); 
var anchorx = rx*Math.SQRT1_2; 
var anchory = ry*Math.SQRT1_2; 
_target.moveTo(x+rx, y); 
_target.curveTo(x+rx, y+controly, x+anchorx, y+anchory); 
_target.curveTo(x+controlx, y+ry, x, y+ry); 
_target.curveTo(x-controlx, y+ry, x-anchorx, y+anchory); 
_target.curveTo(x-rx, y+controly, x-rx, y); 
_target.curveTo(x-rx, y-controly, x-anchorx, y-anchory); 
_target.curveTo(x-controlx, y-ry, x, y-ry); 
_target.curveTo(x+controlx, y-ry, x+anchorx, y-anchory); 
_target.curveTo(x+rx, y-controly, x+rx, y); 



//弧线 
import fc.math.Degree; 
import fc.graphics.draw2d.Ellipse; 
//绘制椭圆或圆形曲线 
class fc.graphics.draw2d.Arc extends Ellipse { 
private var _staAngle; 
private var _endAngle; 
public function Arc(x:Number, y:Number, rx:Number, ry:Number, staAngle,
endAngle) { 
_x = x; 
_y = y; 
_rx = rx; 
_ry = ry; 
_staAngle = staAngle; 
_endAngle = endAngle; 

public function draw() { 
arcFunc(_x, _y, _rx, _ry, _staAngle, _endAngle); 


//绘制椭圆(圆)形曲线 
public function arcFunc(x, y, rx, ry, staAngle, endAngle) { 
if (endAngle == staAngle) { 
return; 

if (Math.abs(endAngle-staAngle)>=360) { 
ellipseFunc(x, y, rx, ry); 
return; 

if (ry == null) { 
ry = rx; 

var curAngle = staAngle; 
var nextAngle = staAngle<endAngle ? (Math.floor(staAngle/45)+1)*45 : 
(Math.ceil(staAngle/45)-1)*45; 
var midcos, midAngle, controlx, controly, anchorx, anchory; 
_target.moveTo(x+Degree.cosD(staAngle)*rx, 
y+Degree.sinD(staAngle)*ry); 
while (true) {
if (staAngle<endAngle && nextAngle>endAngle || staAngle>endAngle 
&& nextAngle<endAngle) { 
nextAngle = endAngle; 

midcos = Degree.cosD((nextAngle-curAngle)/2); 
midAngle = (nextAngle+curAngle)/2; 
controlx = x+Degree.cosD(midAngle)/midcos*rx; 
controly = y+Degree.sinD(midAngle)/midcos*ry; 
anchorx = x+Degree.cosD(nextAngle)*rx; 
anchory = y+Degree.sinD(nextAngle)*ry; 
_target.curveTo(controlx, controly, anchorx, anchory); 
if (nextAngle == endAngle) { 
break; 

curAngle = nextAngle; 
nextAngle += staAngle<endAngle ? 45 : -45; 




//扇形 
import fc.math.Degree; 
import fc.graphics.draw2d.Arc; 
class fc.graphics.draw2d.Sector extends Arc { 
public function Sector(x:Number, y:Number, rx:Number, ry:Number, staAngle, 
endAngle) { 
_x = x; 
_y = y; 
_rx = rx; 
_ry = ry; 
_staAngle = staAngle;
_endAngle = endAngle; 

public function draw() { 
sectorFunc(_x, _y, _rx, _ry, _staAngle, _endAngle); 


//绘制扇形 
private function sectorFunc(x, y, rx, ry, staAngle, endAngle) { 
arcFunc(x, y, rx, ry, staAngle, endAngle); 
if (Math.abs(staAngle-endAngle)>0 && Math.abs(staAngle-endAngle)<360) 

_target.lineTo(x, y); 
_target.lineTo(x+Degree.cosD(staAngle)*rx, 
y+Degree.sinD(staAngle)*ry); 




画图测试 
//导入所需的类 
import fc.graphics.*; 
import fc.graphics.draw2d.*; 
//创建绘图实例 
var test:GDI = new GDI(); 
//定义绘图目标 
test.target = this; 
//定义钢笔样式 
var pen = new Pen(5, Color.green, 100); 
//定义填充样式 
var brush = new SolidBrush(Color.green, 100); 
//绘制填充椭圆 
test.fill(brush, new Rect(100, 100, 100, 100));
//绘制直线 
test.line(pen, new Line(0, 0, 100, 100)); 
//绘制多边形 
test.line(pen, new Poly(200, 150, 200, 5)); 
//用一个按钮清除绘图 
clearBtn.onRelease = function() { 
test.clear(); 
};