WebGL笔记(五):封装顶点和颜色等数组数据(二)

本文介绍了一种管理一维数组的有效方法,通过GroupHelper类实现数据的添加和附加操作。特别针对颜色数据管理,设计了ColorGroup子类,支持颜色模板修复和随机颜色生成。此外,还提供了一个CubeColors函数,用于立方体颜色数组的快速配置。

我觉得花太多篇幅讲数据封装有点跑题了。但是既然开始了,那就做完。

按上篇的约定,这篇说GroupHelper。

GroupHelper目的是管理一个较长的一维数组,具有data和array两个属性。data是数据本身,array是对应的ArrayHelper的数组。

DetailedStatement

 

function GroupHelper(count, model){
    this.data = [];
    this.array = [];
}
GroupHelper.prototype = {
    /* 根据参数判断attach或者add */
    init : function(arg1, arg2){
        if(arg1 instanceof Array){
            this.attach(arg1);
        } else{
            this.add(arg1, arg2);
        }
    },
    /* 以model数组作为模板,添加count个数据 */
    add : function(count, model){
        if(typeof count == 'number' && count > 0 && model instanceof Array){
            if(typeof this.fix == 'function'){
                model = this.fix(model);
            }
            var offset = this.data.length;
            ArrayHelper.model(model, count, this.data);
            if(typeof this.creator == 'function'){
                for(var i = 0; i < count; i++){
                    this.array.push(this.creator(this.data, offset));
                    offset += model.length;
                }
            }
            offset = null;
        }
    },
    /* 将对象附加到一个现有大数组中。data重置,array清空并重新建立。 */
    attach : function(arr){
        if(!(arr instanceof Array)) return;
        this.data = arr;
        this.array = [];
        if(typeof this.creator == 'function'){
            var o = this.creator();
            var step = Math.max(1, o.length || 1);
            o = null;
            for(var i = 0; i < this.data.length; i += step){
                this.array.push(this.creator(this.data, i));
            }
        }
    }
}

 

子类在继承之后,应建立相应fix和creator方法

fix是在执行add方法时,对model数组模板的修复,比如颜色数组模板,每个值应取值在0~1内。

creator是在子类中必须创建的,它应返回一个ArrayHelper实例,用于构建array。

function ColorGroup(){ this.init(arguments[0], arguments[1]); }
Inherit.inherit(ColorGroup, new GroupHelper(), {
    fix : function(model){
        var oriLen = model.length;
        for(var i = 0; i < 4; i++){
            model[i] = ColorHelper.Fix(model[i]);
        }
        if(oriLen < 4){
            model[3] = 1;
        }
        model = model.slice(0, 4);
        oriLen = i = null;
        return model;
    },
    creator : function(data, offset){
        return new ColorHelper(data, offset);
    },
    rand : function(){
        for(var i = 0; i < this.array.length; i++){
            this.array[i].rand();
        }
        i = null;
    }
});

以上代码为颜色总管。可以尝试以下代码:

var cg = new ColorHelper();
cg.add(4, [.5,.5,.5,1])
alert(cg.data);

 

然后我根据立方体着色需求,写个专用函数来产生和管理立方体色彩数组的对象,并定义几个便于管理的方法。

function CubeColors(){
    var cs = new ColorGroup(24, [.5, .5, .5, 1]);
    Inherit.extend(cs, {
        /* 每个面的 a b c d 分别对应4个顶点的颜色,按CSS颜色方式赋值。参数不够时将前一个参数传递给下一个 */
        Front : function(a, b, c, d){ SET(cs, a, b, c, d, 0, 1, 2, 3); },
        Back : function(a, b, c, d){ SET(cs, a, b, c, d, 4, 5, 6, 7); },
        Top : function(a, b, c, d){ SET(cs, a, b, c, d, 8, 9, 10, 11); },
        Bottom : function(a, b, c, d){ SET(cs, a, b, c, d, 12, 13, 14, 15); },
        Right : function(a, b, c, d){ SET(cs, a, b, c, d, 16, 17, 18, 19); },
        Left : function(a, b, c, d){ SET(cs, a, b, c, d, 20, 21, 22, 23); }
    });
    return cs;
    
    function set(cs, i, v){
        typeof v == 'string' && cs.array[i].set(v);
    }
    function SET(cs, a, b, c, d, A, B, C, D){
        var v = 0;
        set(cs, A, v = a || v);
        set(cs, B, v = b || v);
        set(cs, C, v = c || v);
        set(cs, D, v = d || v);
        v = null
    }
}

 

使用方法:

var cs = CubeColors();
cs.Front('fa0', 'fa0', 'f00', 'f00');
cs.Back('060', '060', '0e0', '0e0');
cs.Top('0af', '0af', '00f', '00f');
cs.Bottom('f09', 'f09', 'f0f', 'f0f');
cs.Right('fff', 'fff', '888', '888');
cs.Left('0f0', '0f0', '0a0', '0a0');
//cs.rand();

 

捕获

 

代码末尾那个rand(),可产生随机颜色,可以试试,略有些诡异。

捕获2

 

 

附本篇与上篇的代码

ArrayHelper_beta_1.0.js

WebGL-Step-04pro.html

下篇讲灯光

转载于:https://www.cnblogs.com/muse/archive/2011/12/03/2275012.html

标题SpringBoot智能在线预约挂号系统研究AI更换标题第1章引言介绍智能在线预约挂号系统的研究背景、意义、国内外研究现状及论文创新点。1.1研究背景与意义阐述智能在线预约挂号系统对提升医疗服务效率的重要性。1.2国内外研究现状分析国内外智能在线预约挂号系统的研究与应用情况。1.3研究方法及创新点概述本文采用的技术路线、研究方法及主要创新点。第2章相关理论总结智能在线预约挂号系统相关理论,包括系统架构、开发技术等。2.1系统架构设计理论介绍系统架构设计的基本原则常用方法。2.2SpringBoot开发框架理论阐述SpringBoot框架的特点、优势及其在系统开发中的应用。2.3数据库设计与管理理论介绍数据库设计原则、数据模型及数据库管理系统。2.4网络安全与数据保护理论讨论网络安全威胁、数据保护技术及其在系统中的应用。第3章SpringBoot智能在线预约挂号系统设计详细介绍系统的设计方案,包括功能模块划分、数据库设计等。3.1系统功能模块设计划分系统功能模块,如用户管理、挂号管理、医生排班等。3.2数据库设计与实现设计数据库表结构,确定字段类型、主键及外键关系。3.3用户界面设计设计用户友好的界面,提升用户体验。3.4系统安全设计阐述系统安全策略,包括用户认证、数据加密等。第4章系统实现与测试介绍系统的实现过程,包括编码、测试及优化等。4.1系统编码实现采用SpringBoot框架进行系统编码实现。4.2系统测试方法介绍系统测试的方法、步骤及测试用例设计。4.3系统性能测试与分析对系统进行性能测试,分析测试结果并提出优化建议。4.4系统优化与改进根据测试结果对系统进行优化改进,提升系统性能。第5章研究结果呈现系统实现后的效果,包括功能实现、性能提升等。5.1系统功能实现效果展示系统各功能模块的实现效果,如挂号成功界面等。5.2系统性能提升效果对比优化前后的系统性能
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值