zoukankan      html  css  js  c++  java
  • 3D星形贴图

    3D星形贴图:

    /**
     *
     * *---------------------*
     * |  *** 3D星形贴图 ***  |
     * *---------------------*
     *
     * 编辑修改收录:fengzi(疯子、wu341、wgq341)
     *
     * 不会写代码,我是代码搬运工。
     *
     * 联系方式:QQ(493712833)。
     *
     * 随   笔: https://www.cnblogs.com/fengziwu/
     *
     * 版权协议:请自觉遵守LGPL协议,欢迎修改、复制、转载、传播给更多需要的人。
     * 免责声明:任何因使用此软件导致的纠纷与软件/程序开发者无关。
     * 日   期: 2019.05.08
     *
     */
    package fengzi.bmd
    {
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.display.TriangleCulling;
        import flash.events.Event;
        import flash.geom.Vector3D;
       
        public class StarTexture extends Sprite
        {
            private var _bmpd:BitmapData;
            private var _pointContainer:Sprite;
            private var _graphicContainer:Sprite;
            private var _pointArr:Array = [];
            private var _objArr:Array = [];
            private var _num:int = 5;
            private var _boo:Boolean;//是否是离五角星中心点较近的顶点
            private var _radius1:Number;//五角星中心点离较远顶点的距离(可看作五角星外接圆的半径)
            private var _radius2:Number;//五角星中心点离较近顶点的距离(可看作五角星内接圆的半径)
            private var _focus:Number = 400;
    		
    		/***
    		* 3D星形贴图
    		* @param   img         图片对象
    		* @param   _radius1    五角星中心点离较远顶点的距离(可看作五角星外接圆的半径)
    		* @param   _radius2    五角星中心点离较近顶点的距离(可看作五角星内接圆的半径)
    		***/
            public function StarTexture(img:*,_radius1:Number = 100,_radius2:Number = 40)
            {
    			this._radius1=_radius1;
    			this._radius2=_radius2;
                initViews(img);
                initEventListeners();
            }
            private function initViews(img:*):void
            {
                _pointContainer = new Sprite();
                _graphicContainer = new Sprite();
                _pointContainer.x = _graphicContainer.x =img.width*0.5;
                _pointContainer.y = _graphicContainer.y = img.height*0.5;
    		    _bmpd = new BitmapData(img.width,img.height,false,0)
    			_bmpd.draw(img)
                this.addChild(_pointContainer);
                this.addChild(_graphicContainer);
                createStar();
            }
            private function initEventListeners():void
            {
                this.addEventListener(Event.ENTER_FRAME,onEnterFrame);
            }
            private function onEnterFrame(e:Event):void{
                for(var i:int=0;i<_pointArr.length;i++){
                    _pointArr[i].Z = (_pointArr[i] as MovieClip).transform.getRelativeMatrix3D(_pointContainer).position.z;
                    _pointArr[i].X = (_pointArr[i] as MovieClip).transform.getRelativeMatrix3D(_pointContainer).position.x*(_focus/(_focus+_pointArr[i].Z));
                    _pointArr[i].Y = (_pointArr[i] as MovieClip).transform.getRelativeMatrix3D(_pointContainer).position.y*(_focus/(_focus+_pointArr[i].Z));
                    (_pointArr[i] as MovieClip).transform.matrix3D.appendRotation((mouseX-_pointContainer.x)/50,Vector3D.Y_AXIS);
                    (_pointArr[i] as MovieClip).transform.matrix3D.appendRotation((_pointContainer.y-mouseY)/50,Vector3D.X_AXIS);
                }
                _graphicContainer.graphics.clear();
                _objArr = [];
                for(i=0;i<_num*2;i++){
                    var vertices:Vector.<Number> = new Vector.<Number>();
                    vertices.push(_pointArr[_num*2].X,_pointArr[_num*2].Y,_pointArr[i].X,_pointArr[i].Y,_pointArr[(i+1)%(_num*2)].X,_pointArr[(i+1)%(_num*2)].Y,_pointArr[(i+2)%(_num*2)].X,_pointArr[(i+2)%(_num*2)].Y);
                    var indices:Vector.<int> = new Vector.<int>([0,1,2,0,2,3]);
                    var uvtData:Vector.<Number> = Vector.<Number>([0,0,1,0,1,1,0,1]);//不能new,如果new会导致运行flash.display.Graphics.drawTriangles()运行错误:ArgumentError: Error #2004: 某个参数无效。tell me why?
                    var Z:Number = _pointArr[i].Z + _pointArr[(i+1)%(_num*2)].Z;
                    _objArr.push({V:vertices,I:indices,U:uvtData,Z:Z});
                }
                _objArr.sortOn("Z",18);
                for(i =0;i<_objArr.length;i++){
                    _graphicContainer.graphics.beginBitmapFill(_bmpd);
                    _graphicContainer.graphics.drawTriangles(_objArr[i].V,_objArr[i].I,_objArr[i].U,TriangleCulling.NONE);
                    _graphicContainer.graphics.endFill();
                }
            }
            private function createStar():void
            {
                for(var i:int = 0;i<_num*2;i++){
                    var mc:MovieClip = new MovieClip();
                    _pointContainer.addChild(mc);
                    if(_boo){
                        mc.x=_radius2*Math.cos(2*Math.PI/(_num*2)*i);
                        mc.y=_radius2*Math.sin(2*Math.PI/(_num*2)*i);
                    }else{
                        mc.x=_radius1*Math.cos(2*Math.PI/(_num*2)*i);
                        mc.y=_radius1*Math.sin(2*Math.PI/(_num*2)*i);
                    }
                    mc.z = 0;
                    _pointArr.push(mc);
                    _boo = !_boo;
                }
                var centerMC:MovieClip = new MovieClip();
                _pointContainer.addChild(centerMC);
                centerMC.x = 0;centerMC.y = 0;centerMC.z = -60;
                _pointArr.push(centerMC);
            }
        }
    }
    

      

  • 相关阅读:
    稀疏自编码器和矢量化编程
    使用支持向量机训练mnist数据
    采用libsvm进行mnist训练
    支持向量机
    月下“毛景树”
    最小费用最大流模板
    最大流模板
    选学霸
    线段树 2
    线段树 1
  • 原文地址:https://www.cnblogs.com/fengziwu/p/10908855.html
Copyright © 2011-2022 走看看