zoukankan      html  css  js  c++  java
  • 绘制圆筒

    package
    {
    	import flash.display.GraphicsTrianglePath;
    	import flash.display.Sprite;
    	import flash.display.TriangleCulling;
    	import flash.events.Event;
    	import flash.geom.Vector3D;
    	
    	/**
    	 *  @author:Gaara
    	 *  2012-3-14
    	 *
    	 **/
    	[SWF(width="800", height="600" ,frameRate="30", backgroundColor="#FFFFFF")]
    	public class DrawHoop extends Sprite
    	{
    		private const D:int = 300;
    		
    		//定义路径类
    		private var triangPath:GraphicsTrianglePath;
    		
    		private var sprite:Sprite = new Sprite;
    		
    		private var indices:Vector.<int> = new Vector.<int>;
    		private var uvtData:Vector.<Number> =  new Vector.<Number>;
    		private var vertices:Vector.<Vector3D> = new Vector.<Vector3D>;
    		private var angel:int = 0;
    		
    
    		
    		private const RADIUS:int = 100;//半径
    		
    		private var cols:int = 20;//分成多少份
    		private var radian:Number = 2 * Math.PI / cols;//弧度
    		//		private var rows:int = 20;
    		
    		public function DrawHoop()
    		{
    			sprite.x = this.stage.stageWidth / 2;
    			sprite.y =  this.stage.stageHeight /2;
    			addChild(sprite);
    			
    			for (var i:int = 0;i < cols; i++) 
    			{
    				//前面的点
    				var before:Vector3D =  new Vector3D(Math.cos(radian * i) * RADIUS, -RADIUS/4, Math.sin(radian * i) * RADIUS);
    				vertices.push(before);
    
    				var after:Vector3D =  new Vector3D(Math.cos(radian * i) * RADIUS, RADIUS/4, Math.sin(radian * i) * RADIUS);
    				vertices.push(after);
    			}
    			
    			for (var j:int = 0;j < cols - 1; j++) 
    			{
    				//前面的点
    				indices.push(2*j,2*j+3,2*j+1);
    				indices.push(2*j,2*j+2,2*j+3);
    			}
    			
    			var afterCols:int = cols - 1;
    			//添加最后一个
    			indices.push(2*afterCols,1,2*afterCols+1);
    			indices.push(2*afterCols,0,1);
    			
    			for (var k:int = 0; k < (cols/2); k++) 
    			{
    				uvtData.push(0,0,1);
    				uvtData.push(0,1,1);
    				uvtData.push(1,0,1);
    				uvtData.push(1,1,1);
    			}
    			
    			addEventListener(Event.ENTER_FRAME,onEnterFrame);
    		}
    		
    		protected function onEnterFrame(event:Event):void
    		{
    			angel++;
    			var radianx:Number = mouseX /180*Math.PI;
    			var radiany:Number = mouseY /180*Math.PI;
    			
    			var newVertices:Vector.<Number> = new Vector.<Number>;
    			
    			for (var i:int = 0; i < vertices.length; i++) 
    			{
    				var vec3d:Vector3D =  vertices[i]
    				var newX:Number = Math.cos(radianx) * vec3d.x -  Math.sin(radianx) * vec3d.z;
    				var newZ:Number = Math.cos(radianx) * vec3d.z +  Math.sin(radianx) * vec3d.x;
    				
    				var newX2:Number = Math.cos(radiany) * newX -  Math.sin(radiany) * vec3d.y;
    				var newY:Number = Math.cos(radiany) * vec3d.y +  Math.sin(radiany) * newX;
    				
    				var scale:Number =  D/(D+newZ);
    				uvtData[i*3+2] = scale;
    				
    				newVertices.push(scale * newX2);
    				newVertices.push(scale * newY);
    			}
    			
    			sprite.graphics.clear();
    			sprite.graphics.beginBitmapFill(ResConfig.myLpBmp.bitmapData);
    			sprite.graphics.drawTriangles(newVertices,indices,uvtData,TriangleCulling.NEGATIVE);
    			sprite.graphics.endFill();
    			
    		}		
    	}
    }
    

    首先设置好分成的数量以及半径,然后根据勾股定理,计算每个点的坐标,包括前后,正z以及-z两个点。然后设置索引,

    		indices.push(2*afterCols,1,2*afterCols+1);
    		indices.push(2*afterCols,0,1);
    

     最后两个三角形因为连接起始点需要单独设置,最后设置重复的贴图坐标即可,可交换y,z顶点坐标,修改显示的方向,上面就是修改后的。

  • 相关阅读:
    “error LNK1169: 找到一个或多个多重定义的符号”的解决方法(转载)
    std::ostringstream 转std::string
    【转载】红外感应模块+蜂鸣器实现简易报警
    分割字符串使用空格
    优秀程序员的 18 大法则【转载】
    解决win10 iot VS编程出现的无法引用错误
    [转载] 程序员如何成功追到女神?
    win8/win10/win2012r2 存储池 冗余分析
    [转载][NAS] 使用win8的“存储池”功能~
    mySQL中删除unique key的语法 (删除某个字段的唯一性)
  • 原文地址:https://www.cnblogs.com/riaol/p/2397688.html
Copyright © 2011-2022 走看看