Board logo

标题: [原创]面向对象的程序设计方法在Flash中的体现 [打印本页]

作者: 紫色流星    时间: 2005-10-7 16:09     标题: [原创]面向对象的程序设计方法在Flash中的体现

面向对象的程序设计方法是当前程序设计的一个主流思想。他可以极大的提高代码的利用率和可读性。缩短调试周期和调试难度,所以,现在的主流软件都采用了这种方法,Flash也不例外。今天就以我自己编写的一个三维类来说明这个方法吧。
作者: 紫色流星    时间: 2005-10-7 16:15

首先要建立一个构造函数

我们定名字为:v3d,而且定义为全局变量

  1. // v3d 类构造函数
  2. _global.v3d = function(x, y, z) {
  3.         this.x = x;
  4.         this.y = y;
  5.         this.z = z;
  6. };
复制代码

作者: 紫色流星    时间: 2005-10-7 16:18

由于我们经常用的功能不多,所以我只是写出一部分。

有了构造函数,我们需要一个检测方法,以检查我们的变量值。

一般使用一个返回字符串的方法:

  1. // v3d 返回字符串方法
  2. v3d.prototype.string = function() {
  3.         return ("("+this.x+","+this.y+","+this.z+")");
  4. };
复制代码

作者: 紫色流星    时间: 2005-10-7 16:21

我们现在还需要向量的加法和减法

相信大家的数学知识能看懂

  1. // v3d 向量加法方法
  2. v3d.prototype.plus = function(v) {
  3.         return new this.constructor(this.x+v.x, this.y+v.y, this.z+v.z);
  4. };
  5. // v3d 向量减法方法
  6. v3d.prototype.minus = function(v) {
  7.         return new this.constructor(this.x-v.x, this.y-v.y, this.z-v.z);
  8. };
复制代码

作者: 紫色流星    时间: 2005-10-7 16:29

向量的点乘和叉乘

  1. // v3d 向量点积方法
  2. v3d.prototype.dot = function(v) {
  3.         return (this.x*v.x+this.y*v.y+this.z*v.z);
  4. };
  5. // v3d 向量叉乘方法
  6. v3d.prototype.cross = function(v) {
  7.         var cx = this.y*v.z-this.z*v.y;
  8.         var cy = this.z*v.x-this.x*v.z;
  9.         var cz = this.x*v.y-this.y*v.x;
  10.         return new this.constructor(cx, cy, cz);
  11. };
复制代码

作者: 紫色流星    时间: 2005-10-7 16:38

这个是三维类中应用最多的方法,他是将三维向量投影到平面来的方法。

  1. // v3d 向量的平面的投影方法
  2. v3d.prototype.v3dtov2d = function(d) {
  3.         var nx = this.y*d/(d-this.x);
  4.         var ny = this.z*d/(d-this.x);
  5.         return new v2d(nx, ny);
  6. };
复制代码

作者: 紫色流星    时间: 2005-10-7 16:45

下面是向量旋转的公式方法,有点数学基础的人都可以看懂吧?

  1. // v3d 向量按照给定角度围绕X轴旋转的方法
  2. v3d.prototype.Xrotate = function(xw, b) {
  3.         if (b) {
  4.                 xw *= (Math.PI/180);
  5.         }
  6.         var ny = this.y*Math.cos(xw)+this.z*Math.sin(xw);
  7.         var nz = this.z*Math.cos(xw)-this.y*Math.sin(xw);
  8.         return new this.constructor(this.x, ny, nz);
  9. };
  10. // v3d 向量按照给定角度围绕Y轴旋转的方法
  11. v3d.prototype.Yrotate = function(yw, b) {
  12.         if (b) {
  13.                 yw *= (Math.PI/180);
  14.         }
  15.         var nz = this.z*Math.cos(yw)+this.x*Math.sin(yw);
  16.         var nx = this.x*Math.cos(yw)-this.z*Math.sin(yw);
  17.         return new this.constructor(nx, this.y, nz);
  18. };
  19. // v3d 向量按照给定角度围绕Z轴旋转的方法
  20. v3d.prototype.Zrotate = function(zw, b) {
  21.         if (b) {
  22.                 zw *= (Math.PI/180);
  23.         }
  24.         var nx = this.x*Math.cos(zw)+this.y*Math.sin(zw);
  25.         var ny = this.y*Math.cos(zw)-this.x*Math.sin(zw);
  26.         return new this.constructor(nx, ny, this.z);
  27. };
复制代码

作者: 紫色流星    时间: 2005-10-7 16:56

当然,如果在一个物体整体旋转的时候,每个点都计算三角函数是很占用资源的事情,而且他们的函数值都是一样的,所以完全可以把三角函数值作为参数。

  1. // v3d 向量按照给定三角函数值围绕X轴旋转的方法
  2. v3d.prototype.Xrotate2 = function(c, s) {
  3.         var ny = this.y*c+this.z*s;
  4.         var nz = this.z*c-this.y*s;
  5.         return new this.constructor(this.x, ny, nz);
  6. };
  7. // v3d 向量按照给定三角函数值围绕Y轴旋转的方法
  8. v3d.prototype.Yrotate2 = function(c, s) {
  9.         var nz = this.z*c+this.x*s;
  10.         var nx = this.x*c-this.z*s;
  11.         return new this.constructor(nx, this.y, nz);
  12. };
  13. // v3d 向量按照给定三角函数值围绕Z轴旋转的方法
  14. v3d.prototype.Zrotate2 = function(c, s) {
  15.         var nx = this.x*c+this.y*s;
  16.         var ny = this.y*c-this.x*s;
  17.         return new this.constructor(nx, ny, this.z);
  18. };
复制代码

作者: 紫色流星    时间: 2005-10-7 16:57

今天暂时编写到这里,改天有机会讲解下这个类的应用。
作者: 风中落叶    时间: 2005-10-7 18:37

学习了
期待着继续
作者: 紫色流星    时间: 2005-10-8 09:20

Originally posted by 第八个孩子 at 2005-10-8 09:04:
嗯,不错
希望你继续下去
好好弄个系列的

呵呵~~有了老八的支持,那今天我就把剩下的方法都写出来吧~:P
作者: 紫色流星    时间: 2005-10-8 09:22

创立副本的方法,其实就是复制自己的方法。

重设方法,其实我感觉还不如直接初始化的方便。

  1. // v3d 创建副本方法
  2. v3d.prototype.clone = function() {
  3.         return new this.constructor(this.x, this.y, this.z);
  4. };
  5. // v3d 重设方法
  6. v3d.prototype.reset = function(x, y, z) {
  7.         this.constructor(x, y, z);
  8. };
复制代码

作者: 紫色流星    时间: 2005-10-8 09:26

求已知向量的逆向量的方法。

  1. // v3d 向量求逆方法
  2. v3d.prototype.negate = function() {
  3.         return new this.constructor(-this.x, -this.y, -this.z);
  4. };
复制代码

作者: 紫色流星    时间: 2005-10-8 09:26

对已知向量设置缩放倍数的方法

  1. // v3d 向量缩放方法
  2. v3d.prototype.scale = function(s) {
  3.         return new this.constructor(this.x*s, this.y*s, this.z*s);
  4. };
复制代码

作者: 紫色流星    时间: 2005-10-8 09:27

对已知向量求模和设置模的方法

  1. // v3d 向量求模方法
  2. v3d.prototype.getmod = function() {
  3.         return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z);
  4. };
  5. // v3d 向量设模方法
  6. v3d.prototype.setmod = function(len) {
  7.         var r = this.getmod();
  8.         if (r) {
  9.                 var n = this.scale(len/r);
  10.                 this.x = n.x;
  11.                 this.y = n.y;
  12.                 this.z = n.z;
  13.         } else {
  14.                 this.x = len;
  15.         }
  16. };
复制代码

作者: 紫色流星    时间: 2005-10-8 09:29

两个向量之间求夹角

  1. // v3d 向量夹角方法
  2. v3d.prototype.angle = function(v, b) {
  3.         var dp = this.dot(v);
  4.         var cosAngle = dp/(this.getmod()*v.getmod());
  5.         var angle = Math.acos(cosAngle);
  6.         if (b) {
  7.                 return angle*180/Math.PI;
  8.         } else {
  9.                 return angle;
  10.         }
  11. };
复制代码

作者: 紫色流星    时间: 2005-10-8 09:32

所有的方法都发完了,下面给出语法规则参考使用:

  1. /*
  2. Vector 3D 功能语法列表
  3. my3d=new v3d(x,y,z); //创建构造函数
  4. my3d.string(); //返回my3d的字符串
  5. my3d.reset(); //重设my3d的x,y坐标
  6. your3d=my3d.clone(); //返回my3d的副本给your3d
  7. your3d.equal(my3d); //返回布尔值,比较两个向量是否相等
  8. his3d=your3d.plus(my3d); //返回两个向量的和
  9. his3d=your3d.minus(my3d); //返回两个向量的差
  10. your3d=my3d.negate(); //返回my3d的逆向量
  11. your3d=my3d.scale(s); //返回my3d的s倍放缩
  12. my3d.getmod(); //返回向量的模
  13. my3d.setmod(len); //设置向量的模
  14. my3d.dot(your3d); //返回两个向量的点积
  15. my3d.cross(your3d); //返回两个向量的叉积
  16. my3d.angle(your3d,boolean); //返回两个向量的差角,true为角度,flase为弧度
  17. my2d=my3d.v3dtov2d(distance); //返回三维向量在距离为distance平面投影的二维向量
  18. your3d=my3d.Xrotate(xw,boolean); //将向量绕X轴旋转xw并返回,true为角度,flase为弧度
  19. your3d=my3d.Yrotate(yw,boolean); //将向量绕Y轴旋转yw并返回,true为角度,flase为弧度
  20. your3d=my3d.Zrotate(zw,boolean); //将向量绕Z轴旋转zw并返回,true为角度,flase为弧度
  21. your3d=my3d.Xrotate2(cos,sin); //将向量绕X轴旋转并返回,cos sin 分别为旋转角度的三角函数值
  22. your3d=my3d.Yrotate2(cos,sin); //将向量绕Y轴旋转并返回,cos sin 分别为旋转角度的三角函数值
  23. your3d=my3d.Zrotate2(cos,sin); //将向量绕Z轴旋转并返回,cos sin 分别为旋转角度的三角函数值
  24. */
复制代码

作者: 紫色流星    时间: 2005-10-8 09:35

下面给出这个源文件的下载

附件: Vector3D.as (2005-10-8 09:35, 5.27 KB) / 下载次数 54
http://heubbs.cn/attachment.php?aid=2013&k=d590e270d8c3e54aa64b492212afcd69&t=1734487030&sid=Mtd9rQ
作者: 紫色流星    时间: 2005-10-8 09:39

在程序中可以通过下面的命令引用这个三维类,然后像正常的命令一样使用就可以了。

注意,必须和程序保存在一个文件夹下。

  1. #include<Vector3D.as>
复制代码

作者: 风中落叶    时间: 2005-10-8 12:56

不错不错
我也学习了
作者: 紫色流星    时间: 2005-10-15 17:49

Originally posted by 第八个孩子 at 2005-10-14 19:17:
弄个例子放在这里,给大家看看啊

好的,不急。

我正在琢磨找个简单的,从简到繁的呢:P




欢迎光临 工程家园 (http://heubbs.cn/) Powered by Discuz! 7.2