//繪圖類?
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();?
};