【游客模式】——注册会员,加入11RIA 闪客社区吧!一起见证Flash的再次辉煌……
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
早上看到一个帖子,是求多边形面积的方法,感觉很独特,于是依照该方法做了一个;
[Actionscript3] 纯文本查看 复制代码 //文档类
package {
import flash.display.Sprite;
import flash.geom.Point;
import flash.text.TextField;
public class doc extends Sprite {
var p1:Point=new Point(15,15);
var p2:Point=new Point(50,55);
var p3:Point=new Point(55,15);
var p4:Point=new Point(40,0);
var ar:Array=[p1,p2,p3,p4];
var s:PolygonArea=new PolygonArea(ar);
var dr:DrawPolygon=new DrawPolygon(ar);
var txt:TextField=new TextField()
public function doc():void{
trace("这个多边形的面积为:"+s.area);
addChild(dr);
txt.autoSize="left";
txt.text="这个多边形的面积为:";
txt.appendText(String(s.area));
txt.x=dr.x+10;
txt.y=dr.y+dr.height+5
addChild(txt);
}
}
}
//一个求多边形面积的类;
package {
//需要用到多边形各个顶点的坐标;
import flash.geom.Point;
//类名为多边形面积;
public class PolygonArea {
//定义一个私有属性,面积,后面用getter方法公开;
private var _area:Number=0;
//构造函数中有一个数组参数,用来存放多边形的各个顶点,要按顺序排列;
public function PolygonArea(rest:Array):void {
//初始化方法;
init(rest);
}
//初始化方法里要先检查数组中的成员是不是点类型;
private function init(pa:Array):void {
//用一个布尔值来表示所有成员都是点类型!
var b:Boolean=true;
//借助for循环来检查数组的成员;
for (var i:int = 0; i < pa.length; i++) {
//有一个不是点类型就退出,终止程序;
if (!( pa[i] is Point)) {
trace("你输入的参数不全是点类型,请检查:第" + i + "个参数!!");
b=false;
break;
}
}
//如果都是点类型,开始计算;
if(b){areaF(pa);
}
}
//计算多边形面积的方法;
private function areaF(re:Array):void{
//定义一个整数k,用来把末尾的计算回到起点;
var k:int;
//借助for循环来计算每一个梯形的面积,并相加;
for (var j:int = 0; j < re.length; j++){
//用if语句判断是否到末尾
if (j < re.length - 1){
k = j;
}
//如果到了末尾,k+1指向起点;
else{ k =-1;}
//先要检验数组成员是否为点类型;
if(re[j] is Point&&re[k + 1] is Point){
//计算梯形面积,并赋值;
_area += reckonArea(re[j].x,re[j].y,re[k+1].x,re[k+1].y);
//把计算出来的面积输出,方便调试;
trace(_area)
}
}
}
//下面是计算梯形面积的方法,四个参数分别是第一个点的横坐标和纵坐标,第二个点的横坐标和纵坐标;
private function reckonArea(p1x:Number,p1y:Number,p2x:Number,p2y:Number):Number{
//定义一个存储面积的变量;
var _arN:Number;
//上底;
var a:Number = p1y;
//下底
var b:Number = p2y;
//高;
var h:Number =p2x-p1x;
//面积=(上底+下底)*高÷2;
_arN = (a + b) * h / 2;
//把面积返回;
return _arN;
}
//设置getter方法,公开面积属性;
public function get area():Number{
return _area;
}
}
}
//一个画多边形的类;
package{
//导入Point类;
import flash.geom.Point;
//导入Shape类,用来画图;
import flash.display.Shape;
//类名为画多边形,继承于Shape;
public class DrawPolygon extends Shape{
//传递一个数组,成员为多边形的顶点;
public function DrawPolygon(arr:Array):void{
//初始化方法;
init(arr);
}
//初始化方法里要先检查数组中的成员是不是点类型;
private function init(pa:Array):void {
//用一个布尔值来表示所有成员都是点类型!
var b:Boolean=true;
//借助for循环来检查数组的成员;
for (var i:int = 0; i < pa.length; i++) {
//有一个不是点类型就退出,终止程序;
if (!( pa[i] is Point)) {
trace("你输入的参数不全是点类型,请检查:第" + i + "个参数!!");
b=false;
break;
}
}
//如果参数数组中都是点类型的成员,开始画图;
if(b){drawF(pa);}
}
//画图方法,有一个成员都是点类型的数组参数;
private function drawF(arra:Array):void{
//设置线条类型;
this.graphics.lineStyle(3,0xff0000);
//设置填充颜色;
this.graphics.beginFill(0x009900);
//设置起始点;
this.graphics.moveTo((arra[0] as Point).x,(arra[0] as Point).y);
//定义一个变量,在循环中把终点指向起始点,做出封闭的多边形;
var k:int;
//借助for循环来画图;
for(var j:int=0;j<arra.length;j++){
//用if…else语句来设置变量k的值;
if(j<arra.length-1){k=j;}
else{k=-1;}
//先判断成员是不是点类型,再画图;
if(arra[k+1] is Point){
this.graphics.lineTo(arra[k+1].x,arra[k+1].y);
}
}
//结束填充;
this.graphics.endFill();
}
}
}
|