2021SC@SDUSC山东大学软件学院软件工程应用与实践——claygl(源代码分析12)

2021SC@SDUSC

目录

一.clay.Value类概述

二.clay.Value类的作用

三.clay.Value类源码分析

1.new Value()

2.(static) constant(constant) → {clay.Value}

3.(static) random1D(min, max) → {clay.Value}

4.(static) random2D(min, max) → {clay.Value}

5.(static) random3D(min, max) → {clay.Value}

6.(static) vector(vector) → {clay.Value}

7.get(out opt) → {number|clay.Vector2|clay.Vector3}


一.clay.Value类概述

    clay.Value是一个能够生成常量及随机的一维,二维和三维生成器。

二.clay.Value类的作用

    clay.Value能够生成常量的一维,二维和三维值,以及随机的一维,二维和三维值。

三.clay.Value类源码分析

1.new Value()

    该函数是Value的构造函数,能够生成随机数或一维,二维或三维的矢量常数。

    无参数。

    其源代码为:

var Value = function() {};

    构造函数并未实现任何方法。

2.(static) constant(constant) → {clay.Value}

    该函数能够创建一个常量的一维值。

    参数为constant,类型为number,表示生成的常量一维值。

    其源代码为:

Value.vector = function(vector) {
    return new VectorValue(vector);
};

    从源代码中可以看出,该函数返回一个新构造的对象VectorValue,传入的参数为形式参数vector,VectorValue的代码如下:

var VectorValue = function(val) {
    var Constructor = val.constructor;
    this.get = function(out) {
        if (!out) {
            out = new Constructor();
        }
        out.copy(val);
        return out;
    };
};

    该函数提取形式参数val对象的constructor,调用get方法,判断out是否存在,若不存在则创建一个Constructor对象并赋值给out。out调用copy方法,对val进行复制,并返回out。从而通过该方法,生成一个常量一维值。

3.(static) random1D(min, max) → {clay.Value}

    该函数能够创建一个随机一维值。

    参数有2个,min,类型为number,表示生成一维值的最小值,max,类型为number,表示生成一维值的最大值。

    其源代码为:

Value.random1D = function(min, max) {
    return new Random1D(min, max);
};

    从源代码中可以看出,该函数创建一个Random1D对象,传入参数为形参min和max。Random1D构造方法的代码如下:

var Random1D = function(min, max) {
    var range = max - min;
    this.get = function() {
        return Math.random() * range + min;
    };
};

    该函数首先计算最大值和最小值之间的范围range,接着,调用Math.random方法生成0到1的数,乘以范围range,再加上最小值min,即可生成min到max之间的随机数。从而生成一个指定范围的一维随机数。

4.(static) random2D(min, max) → {clay.Value}

    该函数能够创建一个随机二维值。

    参数有2个,min,类型为clay.Vector2,表示生成二维值的最小值,max,类型为clay.Vector2,表示生成二维值的最大值。

    其源代码为:

Value.random2D = function(min, max) {
    return new Random2D(min, max);
};

    从源代码中可以看出,该函数创建一个Random2D对象,传入参数为形参min和max。Random2D构造方法的代码如下:

var Random2D = function(min, max) {
    var rangeX = max.x - min.x;
    var rangeY = max.y - min.y;
    this.get = function(out) {
        if (!out) {
            out = new Vector2();
        }
        Vector2.set(
            out,
            rangeX * Math.random() + min.array[0],
            rangeY * Math.random() + min.array[1]
        );
        return out;
    };
};

    该函数首先计算x维的范围max.x和min.x的差值rangeX,再计算y维的范围max.y和min.y的差值rangeY,然后判断out是否存在,若不存在则构造一个Vector2并赋值给out,调用Vector2的set方法,与一维一样,设置out的x维为max.x和min.x之间的随机数,设置out的y维为max.y和min.y之间的随机数,最后返回out。从而实现二维随机数的生成。

5.(static) random3D(min, max) → {clay.Value}

    该函数能够创建一个随机三维值。

    参数有2个,min,类型为clay.Vector3,表示生成三维值的最小值,max,类型为clay.Vector3,表示生成三维值的最大值。

    其源代码为:

Value.random3D = function(min, max) {
    return new Random3D(min, max);
};

    从源代码中可以看出,该函数创建一个Random3D对象,传入参数为形参min和max。Random3D构造方法的代码如下:

var Random3D = function(min, max) {
    var rangeX = max.x - min.x;
    var rangeY = max.y - min.y;
    var rangeZ = max.z - min.z;
    this.get = function(out) {
        if (!out) {
            out = new Vector3();
        }
        Vector3.set(
            out,
            rangeX * Math.random() + min.array[0],
            rangeY * Math.random() + min.array[1],
            rangeZ * Math.random() + min.array[2]
        );
        return out;
    };
};

     该函数首先计算x维的范围max.x和min.x的差值rangeX,再计算y维的范围max.y和min.y的差值rangeY,最后计算z维的范围max.z和min.z的差值rangeZ,然后判断out是否存在,若不存在则构造一个Vector3并赋值给out,调用Vector3的set方法,与一维一样,设置out的x维为max.x和min.x之间的随机数,设置out的y维为max.y和min.y之间的随机数,设置out的z维为max.z和min.z之间的随机数,最后返回out。从而实现三维随机数的生成。

6.(static) vector(vector) → {clay.Value}

    该函数能够创建二维或三维的常量矢量。

    参数为vector,类型为clay.Vector2或clay.Vector3,表示生成的二维或三维的常量矢量。

    其源代码为:

Value.vector = function(vector) {
    return new VectorValue(vector);
};

    从源代码中可以看出,该函数创建一个VectorValue对象,传入参数为形参vector。VectorValue构造方法的代码如下:

var VectorValue = function(val) {
    var Constructor = val.constructor;
    this.get = function(out) {
        if (!out) {
            out = new Constructor();
        }
        out.copy(val);
        return out;
    };
};

    该函数提取形式参数val对象的constructor,调用get方法,判断out是否存在,若不存在则创建一个Constructor对象并赋值给out。out调用copy方法,对val进行复制,并返回out。从而通过该方法,生成一个常量二维值或常量三维值。

7.get(out opt) → {number|clay.Vector2|clay.Vector3}

    该函数的作用是获取一个构造的对象,如Construtor,Random1D,Random2D或Random3D。

    参数为out,类型为number,clay.Vector2或clay.Vector3,表示构造的Construtor,Random1D,Random2D或Random3D所处在的对象。

    其源代码为:

Value.prototype.get = function(out) {};

    可自己实现代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值