等速螺线又称阿基米德螺线。它的应用很广泛,在工业设计领域当中有着很重大的贡献。翻开高中课本,这种概念解析就可以看到他的概念定义。这里就不想抛书包了。
今天,我们来创建一条简单的等速螺线。它的公式很简单: ρ=at+P0 ,在特殊的情况下,可以变成 ρ=at。(a>0,t为角度)
有了这个公式,我们可以利用as 绘制函数来描绘一条等速螺线,可以采用两种的方式来制作,一种是三角函数,第二种是极坐标。
我们采用第二种方式来制作。
创建一个螺线类
package {//等速螺旋线import flash.display.Sprite;import flash.geom.Point;public class Luoxuan extends Sprite{public function Luoxuan(){this.graphics.moveTo(0,0);}//创建2D的螺旋线public function creatLuoxuan(r:Number,n:int):void{ var rad:Number=2*Math.PI/n;for (var j:Number=0; j<=360; j++){var len:Number=r*j*rad;var point:Point=Point.polar(len,j*rad);drawPoint(point);}//drawPoint(new Point(0,0));}//描点private function drawPoint(point:Point):void{this.graphics.lineStyle(1);this.graphics.lineTo(point.x,point.y);}}}
我们主要涉及到一个坐标转换的问题,极坐标当中采用的转换公式,在Point里面可以找到相关的转换方法,或者我们可以自己写一个也可以
var point:Point=Point.polar(len,j*rad);
一个长度,一个是角度,两者进行转换。
主程序运行:
package {import flash.display.Sprite;import flash.events.*;public class Main extends Sprite{private var obj:Luoxuan;public function Main(){init();}private function init():void{obj=new Luoxuan();//创建螺线对象obj.creatLuoxuan(8,100);obj.x=stage.stageWidth/2;obj.y=stage.stageHeight/2;addChild(obj);}}}
运行之后,螺线就出来了。
为了加强一个动画感,我们可以借助旋转Y轴来观看这个螺线。
package {import flash.display.Sprite;import flash.events.*;public class Main extends Sprite{private var obj:Luoxuan;public function Main(){init();}private function init():void{obj=new Luoxuan();//创建螺线对象obj.creatLuoxuan(8,100);obj.x=stage.stageWidth/2;obj.y=stage.stageHeight/2;addChild(obj);addEventListener(Event.ENTER_FRAME,Run);}private function Run(event:Event):void{obj.rotationY+=1;//以y轴旋转}}}
事后,我修改了一些参数,发现了另外一些有趣的图像.通过螺旋线特征,发现图像很有趣
for (var j:Number=0; j<=360; j++) { var len:Number=r*j*rad; var point:Point=Point.polar(len,j*rad); drawPoint(point); }
事后之中,我将porlar 第二个参数进行尝试改造,随便输入去,发现一些特征,产生一些意想不到图形效果。
var rad:Number=2*Math.PI/n;
当n值一定的时候,则我们将360度平均分成了2*Math.PI/n; 等分,也就是说,我描点的时候,假设输入了正常的情况,他会出现等速的螺线
var point:Point=Point.polar(len,j*rad); 出现了等速螺线,呈现出一种圆的感觉。
当我改成了这个角度值的时候,发生了变化
var point:Point=Point.polar(len,j*10);
我按 11,12,13,14--n值一直这样填充入去这些数当中,
var point:Point=Point.polar(len,j*11);
var point:Point=Point.polar(len,j*12);
var point:Point=Point.polar(len,j*13);
这样一直实验
结果让我感觉到兴奋,这种螺线会变化出意外的图像,看看下面的情况
这些可能是一种图形美,你会慢慢发现到,变化的情况很多,令人意想不到。可以进行尝试一下。
修改了另外一个参数。变化出来的图像
对程序进行改造:
package {import flash.display.Sprite;import flash.events.*;import flash.utils.Timer;public class Main extends Sprite{private var obj:Luoxuan;private var n:int=0;public function Main(){init();}private function init():void{obj=new Luoxuan();//创建螺线对象addChild(obj);var timer:Timer=new Timer(2000);//计算两秒转换一个图形timer.addEventListener(TimerEvent.TIMER,onTimer);timer.start();addEventListener(Event.ENTER_FRAME,Run);}private function Run(event:Event):void{ obj.x=stage.stageWidth/2;obj.y=stage.stageHeight/2;obj.rotationY+=1;//以y轴旋转}private function onTimer(event:TimerEvent):void{ obj.clear();n++; obj.creatLuoxuan(8,100,n);}}}
package {//等速螺旋线import flash.display.Sprite;import flash.geom.Point;public class Luoxuan extends Sprite{public function Luoxuan(){this.graphics.moveTo(0,0);}//创建2D的螺旋线public function creatLuoxuan(r:Number,n:int,angle:Number):void{ var rad:Number=2*Math.PI/n;for (var j:Number=0; j<=360; j++){var len:Number=r*j*rad;var point:Point=Point.polar(len,j*angle);drawPoint(point);}//drawPoint(new Point(0,0));}//描点private function drawPoint(point:Point):void{this.graphics.lineStyle(1);this.graphics.lineTo(point.x,point.y);}public function clear():void{this.graphics.clear();}}}
增加一个可以变化的参数:
public function creatLuoxuan(r:Number,n:int,angle:Number):void
这样就可以变化出很多不错的图形。
按时间间隔来进行转换一些图像。