返回列表 发帖

[原创]面向对象的程序设计方法在Flash中的体现

面向对象的程序设计方法是当前程序设计的一个主流思想。他可以极大的提高代码的利用率和可读性。缩短调试周期和调试难度,所以,现在的主流软件都采用了这种方法,Flash也不例外。今天就以我自己编写的一个三维类来说明这个方法吧。
欢迎光临我的个人空间:★四维空间★

首先要建立一个构造函数

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

  1. // v3d 类构造函数
  2. _global.v3d = function(x, y, z) {
  3.         this.x = x;
  4.         this.y = y;
  5.         this.z = z;
  6. };
复制代码
欢迎光临我的个人空间:★四维空间★

TOP

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

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

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

  1. // v3d 返回字符串方法
  2. v3d.prototype.string = function() {
  3.         return ("("+this.x+","+this.y+","+this.z+")");
  4. };
复制代码
欢迎光临我的个人空间:★四维空间★

TOP

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

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

  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. };
复制代码
欢迎光临我的个人空间:★四维空间★

TOP

向量的点乘和叉乘

  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. };
复制代码
欢迎光临我的个人空间:★四维空间★

TOP

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

  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. };
复制代码
欢迎光临我的个人空间:★四维空间★

TOP

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

  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. };
复制代码
欢迎光临我的个人空间:★四维空间★

TOP

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

  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. };
复制代码
欢迎光临我的个人空间:★四维空间★

TOP

今天暂时编写到这里,改天有机会讲解下这个类的应用。
欢迎光临我的个人空间:★四维空间★

TOP

学习了
期待着继续
从小就牛B

TOP

返回列表