发新话题
打印

[分享] 关于统计图的类的总结

本帖已经被作者加入个人空间

关于统计图的类的总结

在这里,有四个统计图的类,它们分别是:(1)条形统计图;(2)折线统计图;(3)直方统计图(和条形统计图相似,很难分出区别,但人教版初中数学确确实实将他们分开);(4)扇形统计图;其中(1)(2)(3)的关系比较密切。在这里,(1)是(2)的超类,(2)又是(3)的超类,所以(1)是(2)的爸爸,(2)是(3)的爸爸,(1)是(3)的爷爷。第一次写这么啰嗦的关系,肯定有很多不完美的地方。
现在看看(1):
class:
class txtjt {
//坐标的位置
public var zb_x:Number = 80;
public var zb_y:Number = 200;
//接受数组数据
public var sj_array:Array = new Array();
//数组数据的个数(画坐标的横坐标要用到)
public var max_x:Number;
//条形统计图的条形颜色
public var ys_array = new Array(0x000000, 0xff0000, 0x00ff00, 0x0000ff, 0xcccc66, 0x66cc00, 0xcc00ff, 0x000099, 0x003300, 0x00cc00, 0x990099, 0x000000, 0xff0000, 0x00ff00, 0x0000ff, 0xcccc66, 0x66cc00, 0xcc00ff, 0x000099, 0x003300, 0x00cc00, 0x990099);
//条形统计图的栏目
public var lx_array:Array = new Array();
public var _mc:MovieClip;
public var zb_array:Array;
//
public var d:Number = 30;
public var l:Number = 40;
public var h:Number;
public var zb_b:Boolean = false;
//建构函数
public function txtjt(_array:Array, zb_array:Array, _mc:MovieClip) {
  this.lx_array = _array;
  this.zb_array = zb_array;
  this._mc = _mc;
  this.max_x = _array.length;
}
//定义方法,找出数组中的最大值
public function max_fc():Number {
  var max:Number = sj_array[0];
  for (var i:Number = 0; i<sj_array.length; i++) {
   max<sj_array ? max=sj_array : max=max;
  }
  h = 100/max;
  return max;
}
//定义画图函数:
public function ht_fc(_array:Array):Void {
  sj_array = _array;
  zb_fc();
  tx_fc();
}
//定义画出坐标轴的方法
public function zb_fc():Void {
  var n:Number = 15;
  max_fc();
  //画坐标:
  _mc.lineStyle(1, 0x000000, 100);
  _mc.moveTo(zb_x, zb_y);
  if (zb_b) {
   _mc.lineTo(zb_x+4, zb_y-4);
   _mc.lineTo(zb_x+7, zb_y+4);
   _mc.lineTo(zb_x+10, zb_y);
  }
  _mc.lineTo(zb_x+l*max_x+d+n, zb_y);
  _mc.lineTo(zb_x+l*max_x+d-5+n, zb_y-5);
  _mc.moveTo(zb_x+l*max_x+d+n, zb_y);
  _mc.lineTo(zb_x+l*max_x+d-5+n, zb_y+5);
  _mc.moveTo(zb_x, zb_y);
  _mc.lineTo(zb_x, zb_y-120);
  _mc.lineTo(zb_x-5, zb_y-120+5);
  _mc.moveTo(zb_x, zb_y-120);
  _mc.lineTo(zb_x+5, zb_y-120+5);
  _mc.moveTo(zb_x, zb_y);
  _mc.lineStyle(1, 0x000000, 20);
  _mc.beginFill(0x33ffcc, 40);
  _mc.lineTo(zb_x+l*max_x+n, zb_y);
  _mc.lineTo(zb_x+l*max_x+n, zb_y-100);
  _mc.lineTo(zb_x, zb_y-100);
  _mc.lineTo(zb_x, zb_y);
  _mc.endFill();
  _mc.moveTo(zb_x, zb_y-25);
  _mc.lineTo(zb_x+l*max_x+n, zb_y-25);
  _mc.moveTo(zb_x, zb_y-50);
  _mc.lineTo(zb_x+l*max_x+n, zb_y-50);
  _mc.moveTo(zb_x, zb_y-75);
  _mc.lineTo(zb_x+l*max_x+n, zb_y-75);
  _mc.createTextField("y_txt", 0, zb_x, zb_y-120, 0, 0);
  _mc.y_txt.text = zb_array[0];
  _mc.createTextField("x_txt", 1, zb_x+l*max_x, zb_y, 0, 0);
  _mc.x_txt.text = zb_array[1];
  _mc.y_txt.autoSize = true;
  _mc.x_txt.autoSize = true;
}
//画条形图:
private function tx_fc():Void {
  for (var i:Number = 0; i<max_x; i++) {
   _mc.createEmptyMovieClip("mc"+i, 3+i);
   _mc["mc"+i].lineStyle(1, 0x000000, 0);
   _mc["mc"+i].beginFill(ys_array);
   _mc["mc"+i].moveTo(zb_x+i*l+8, zb_y);
   _mc["mc"+i].lineTo(zb_x+i*l+d+8, zb_y);
   _mc["mc"+i].lineTo(zb_x+i*l+d+8, zb_y-h*sj_array);
   _mc["mc"+i].lineTo(zb_x+i*l+8, zb_y-h*sj_array);
   _mc["mc"+i].lineTo(zb_x+i*l+8, zb_y);
   _mc["mc"+i].endFill();
   _mc["mc"+i]._alpha = 50;
   _mc["mc"+i].onRollOver = function() {
    this._alpha = 100;
   };
   _mc["mc"+i].onRollOut = function() {
    this._alpha = 50;
   };
   //
   _mc.createTextField("txt"+i, 10+i, zb_x+i*l+23, zb_y-h*sj_array-15, 0, 0);
   _mc["txt"+i].text = sj_array;
   _mc["txt"+i].autoSize = true;
   _mc["txt"+i].autoSize = "center";
   _mc.createTextField("lx"+i, 20+i, zb_x+i*l+23, zb_y, 0, 0);
   _mc["lx"+i].text = lx_array;
   _mc["lx"+i].autoSize = true;
   _mc["lx"+i].autoSize="center";
  }
  for (var i:Number = 0; i<5; i++) {
   _mc.createTextField("rs"+i, 30+i, zb_x-3, zb_y-25*i-10, 0, 0);
   _mc["rs"+i].text = Math.round(max_fc()*i/4);
   _mc["rs"+i].autoSize = true;
   _mc["rs"+i].autoSize = "right";
  }
}
}
as:
_root.createEmptyMovieClip("_mc", 0);
var t = new txtjt(["新闻", "体育", "新闻", "美术", "历史"], ["人数", "节目类别"], _mc);
t.ht_fc([2, 5, 12, 24, 6]);
效果

(2):
class:
class zxtjt extends txtjt {
public var b:Boolean = false;
public var sj_array:Array;
public var dot_mc:MovieClip;
public var dot_array:Array;
public function zxtjt(_array:Array, zb_array:Array, _mc:MovieClip, b:Boolean) {
  this.lx_array = _array;
  this.zb_array = zb_array;
  this._mc = _mc;
  this.max_x = _array.length;
  //
  this.b = b;
  set_dl(30,40,false)
}
public function set_dl(d:Number,l:Number,zb_b:Boolean):Void {
  this.d = d;
  this.l = l;
  this.zb_b=zb_b;
}
//定义画折线的方法:
public function zx_fc() {
  _mc.createEmptyMovieClip("zx_mc", 50);
  _mc.zx_mc.lineStyle(1, 0xff0000);
  _mc.zx_mc.moveTo(zb_x+8+0.5*d, zb_y-sj_array[0]*100/max_fc());
  for (var i:Number = 1; i<max_x; i++) {
   _mc.zx_mc.lineTo(zb_x+i*l+0.5*d+8, zb_y-sj_array*100/max_fc());
  }
}
//定义画小圆点的方法:
public function dot_fc(dot_mc:MovieClip):Void {
  var x:Number = 0;
  var y:Number = 0;
  var r:Number = 2;
  dot_mc.lineStyle(1, 0xff0000);
  dot_mc.moveTo(x+r, y);
  dot_mc.beginFill(0xff0000);
  for (var i:Number = 0; i<2*Math.PI+0.1; i += 0.1) {
   dot_mc.lineTo(x+r*Math.cos(i), y+r*Math.sin(i));
  }
  dot_mc.endFill();
}
//分布小圆点:
public function fb_fc() {
  //var d:Number = 20;
  //var l:Number = 40;
  for (var i:Number = 0; i<sj_array.length; i++) {
   _mc.createEmptyMovieClip("dot_mc"+i, 100+i);
   dot_fc(_mc["dot_mc"+i]);
   _mc["dot_mc"+i]._x = zb_x+8+0.5*d+i*l;
   _mc["dot_mc"+i]._y = zb_y-sj_array*100/max_fc();
  }
}
//画图:
public function hzxt_fc(_array:Array) {
  sj_array = _array;
  zx_fc();
  if (b) {
   ht_fc(_array);
  } else {
   fb_fc(20, 20);
   ht_fc(_array);
   for (var i in _mc) {
    if (typeof (_mc) == "movieclip" && _mc._name.slice(0, 2) == "mc") {
     _mc._visible = false;
    }
   }
  }
}
}
as:
_root.createEmptyMovieClip("_mc", 0);
var t = new zxtjt(["新闻", "体育", "新闻", "美术", "历史"], ["人数", "节目类别"], _mc, true);
t.hzxt_fc([2, 5, 12, 24, 6]);
效果:

(3):
class:
class zftjt extends zxtjt {
public function zftjt(_array:Array, zb_array:Array, _mc:MovieClip, b:Boolean) {
  this.lx_array = _array;
  this.zb_array = zb_array;
  this._mc = _mc;
  this.max_x = _array.length;
  //
  this.b = b;
  set_dl(40, 40, true);
}
public function hzft_fc(_array:Array) {
  sj_array = _array;
  if (b) {
   ht_fc(_array);
   zx_fc();
  } else {
   ht_fc(_array);
  }
}
}
as:
_root.createEmptyMovieClip("_mc", 0);
var t = new zftjt(["新闻", "体育", "新闻", "美术", "历史"], ["人数", "节目类别"], _mc, true);
t.hzft_fc([2, 5, 12, 24, 6]);
效果:


[ 本帖最后由 200398sb40whb 于 2008-5-16 15:55 编辑 ]

TOP

(4):
class:
class sxtjt {
public var fk_x:Number = 350;
public var fk_y:Number = 100;
public var x0:Number = 200;
public var y0:Number = 200;
public var r:Number = 80;
public var ys_array = new Array(0x000000, 0xff0000, 0x00ff00, 0x0000ff, 0xcccc66, 0x66cc00, 0xcc00ff, 0x000099, 0x003300, 0x00cc00, 0x990099, 0x000000, 0xff0000, 0x00ff00, 0x0000ff, 0xcccc66, 0x66cc00, 0xcc00ff, 0x000099, 0x003300, 0x00cc00, 0x990099);
public var lx_array:Array = new Array();
public var sj_array:Array;
public var jd_array:Array = new Array();
public var mc:MovieClip;
public var zs:Number = 0;
public function sxtjt(_array:Array, mc:MovieClip) {
  this.lx_array = _array;
  this.mc = mc;
}
//计算sj_array的数据的和;
public function setp():Number {
  zs = 0;
  var i:Number = 0;
  for (i=0; i<this.sj_array.length; i++) {
   this.zs = this.zs+this.sj_array;
  }
  return this.zs;
}
//给jd_array赋值;
public function seth() {
  setp();
  for (var i:Number = 0; i<this.sj_array.length; i++) {
   if (i == 0) {
    this.jd_array = Math.round(1000*(2*Math.PI)*(this.sj_array/this.zs))/1000;
   } else {
    this.jd_array = this.jd_array[i-1]+Math.round(1000*(2*Math.PI)*(this.sj_array/this.zs))/1000;
   }
  }
}
//定义画图函数:
public function ht_fc(_array:Array):Void {
  sj_array = _array;
  sethsx();
}
//画扇形:
public function sethsx():Void {
  seth();
  var l_array = new Array();
  l_array[0] = Number(0);
  var hh_array = l_array.concat(this.jd_array);
  var i:Number;
  var j:Number;
  for (i=0; i<this.sj_array.length; i++) {
   //fangkuai
   this.mc.createEmptyMovieClip("fk"+i, 40+i);
   this.mc["fk"+i].lineStyle(1, 0x000000, 100);
   this.mc["fk"+i].moveTo(fk_x, fk_y+(i*30)+20);
   this.mc["fk"+i].beginFill(ys_array);
   this.mc["fk"+i].lineTo(fk_x+20, fk_y+(i*30)+20);
   this.mc["fk"+i].lineTo(fk_x+20, fk_y+(i*30)+40);
   this.mc["fk"+i].lineTo(fk_x, fk_y+(i*30)+40);
   this.mc["fk"+i].lineTo(fk_x, fk_y+(i*30)+20);
   this.mc["fk"+i].endFill();
   //fangkuang
   mc.lineStyle(1, 0x000000, 100);
   mc.moveTo(fk_x-10, fk_y+12);
   mc.lineTo(fk_x+90, fk_y+12);
   mc.lineTo(fk_x+90, fk_y+sj_array.length*30+20);
   mc.lineTo(fk_x-10, fk_y+sj_array.length*30+20);
   mc.lineTo(fk_x-10, fk_y+12);
   //shuzi
   this.mc.createTextField("shz"+i, 60+i, fk_x+22, fk_y+(i*30)+20, 140, 40);
   this.mc["shz"+i].text = lx_array+Math.round(1000*sj_array/zs)/10+"%";
   //shanxing
   this.mc.createEmptyMovieClip("mc"+i, i);
   this.mc["mc"+i]._alpha = 50;
   this.mc["mc"+i].onRollOver = function() {
    this._alpha = 100;
   };
   this.mc["mc"+i].onRollOut = function() {
    this._alpha = 50;
   };
   this.mc["mc"+i].lineStyle(1, 0x000000, 100);
   this.mc["mc"+i].moveTo(x0, y0);
   this.mc["mc"+i].beginFill(ys_array);
   for (j=hh_array; j<=hh_array[i+1]; j=j+0.001) {
    var x1 = x0+r*Math.cos(j);
    var y1 = y0+r*Math.sin(j);
    this.mc["mc"+i].lineTo(x1, y1);
   }
   this.mc["mc"+i].lineTo(x0, y0);
   this.mc["mc"+i].endFill();
  }
}
}
as:
_root.createEmptyMovieClip("_mc", 0);
var t = new sxtjt(["新闻", "体育", "新闻", "美术", "历史"], _mc);
t.ht_fc([2, 5, 12, 24, 6]);
效果:

TOP

后记:
用继承写子类确实省了不少功夫,周末准备写个统计表的类,希望统计图的类实现的效果:
(1)实现方向键导航;
(2)以不同的颜色区分区域;
(3)由构造函数决定几行几列
应该不难!
有建议请到http://space.flash8.net/space/?uid/284926指教

[ 本帖最后由 200398sb40whb 于 2008-5-16 16:05 编辑 ]

TOP

TOP

发新话题