对数学这一部分,我越来越喜欢关于flash 和数学的结合。高中的数学,大学的数学都很想很想接触,但是由于高等数学并没学得很好,所以这部分的知识缺少了。今天无意之中,看到球体的参数的方程的时候,让我 兴趣大增了。仔细观看那个参数方程,越发觉他的魅力。
球面的公式:x*x+y*y+z*z=a*a;
他的参数方程式:
(网上转载过来的图)
接下来就需要知道a ,θ, φ 各自的含义,a代表了球体的半径,,参数φ就是地球上的纬度,θ就是经度。这一部知识可以参考
http://baike.baidu.com/view/324915.htm
他的范围就是以下:
0≤θ≤2π,0≤φ≤π
他的范围 一个介于360度,一个最大值是介于180度。从这里我们可以借助两个循环来创造下面的程序。
接下来的程序 采用flash cs4来支持我们这次的程序:我们先创建一个小球的元件,这个小球的元件用于分布其位置 名称为Ball ,他仅仅是一个元件。
按公式来进行对小球分布,要区别于数学里面y 和z 和flash 坐标系当中的y 和z ,这是因为需要flash 是2d屏幕 空间的坐标不一样。这样模拟出来的球比较偏向数学形状,当然按数学原来公式设定也可以 模拟出来角度就不一样,可以尝试一下。
主要是采用二维循环来创建,横坐标和纵坐标这样扫描的方式来创造,对于圆柱体也一样适用的。
private function createSphere():void { for (var i:int=0; i<180; i+=10) { for (var j:int=0; j<360; j+=10) { var ball:Ball=new Ball(); contain.addChild(ball); ball.x=R*Math.sin(i*Math.PI/180)*Math.cos(j*Math.PI/180); ball.z=R*Math.sin(i*Math.PI/180)*Math.sin(j*Math.PI/180); ball.y=R*Math.cos(i*Math.PI/180); } } }
转换一下角度同样效果不一样。这些可以尝试一下。上半球面。
下半球面。
总的代码:
package { import flash.display.Sprite; import flash.events.*; public class Main extends Sprite { private var R:int=150;//球体半径 //private var a:int=100;//用于椭圆的球体 // private var b:int=80; // private var c:int=70; private var centerX:Number=stage.stageWidth/2; private var centerY:Number=stage.stageHeight/2; private var contain:Sprite=new Sprite();//创建容器 public function Main() { addChild(contain); contain.x=centerX; contain.y=centerY; createSphere();//创建球体分布 addEventListener(Event.ENTER_FRAME,Run); } private function createSphere():void { for (var i:int=0; i<180; i+=10) { //纬度 for (var j:int=0; j<360; j+=10) { //经度 var ball:Ball=new Ball(); contain.addChild(ball); ball.x=R*Math.sin(i*Math.PI/180)*Math.cos(j*Math.PI/180); ball.z=R*Math.sin(i*Math.PI/180)*Math.sin(j*Math.PI/180); ball.y=R*Math.cos(i*Math.PI/180); } } } private function Run(event:Event):void { contain.rotationY+=0.2; } } }
小结:
对于flash 能够创建如此的程序 我也感觉到惊讶,结合数学一些理论当中,展示出来的形状也呈现出一种美态。大家可以尝试一下,对球体的一些理论依旧可以深入下去。你会发现不仅仅球体,对于你学过的知识也能够发挥出一个不错的效果。
不过,不得不提到一点,内存的使用上,付出代价。所以这一部分也需要考虑当中去。如果有好的建议和意见可以留下你的宝贵的意见。