分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
当初看到这些线的时候 是在一个数学的网上,今天也动手弄了一个心形线。内容其实很简单,没有什么花俏的东西,但是利用极坐标方程可以结合flash 当中,同样也会使用极坐标的方程绘制玫瑰线。由于能力有限,还是一步步来吧。
今天学了这个东西。我们把公式粘贴上,都可以网上搜索到
//四种方向心形线
r=a*(1+cos(angle))
r=a*(1-cos(angle))
r=a*(1+sin(angle))
r=a*(1-sin(angle))
这四种的极坐标方程,有了这个方程之后,我们可以借助这种方程来实现绘制一个心形。我懒得一点没有填充颜色,有兴趣可以补充。
这次我们使用的Point类当中一个极坐标转换的方法来描点。
var point:Point=Point.polar(r,angle);//极坐标转换笛卡尔坐标
这个方法可以将极坐标转换我们常用的坐标系。这样我们可以利用绘图api 描绘每一个点。
我们利用这个方法,将他做一个简单描点动画。如下代码
其中每一个公式里面心形的方向也不会相同的。
不妨自己可以测试一下。好,累了 马上睡觉。第二天再补充。
- package
- {
- //四种方向心形线
- //r=a*(1+cos(angle))
- //r=a*(1-cos(angle))
- //r=a*(1+sin(angle))
- //r=a*(1-sin(angle))
- import flash.display.Sprite;
- import flash.events.*;
- import flash.geom.Point;
- import flash.display.Graphics;
- import flash.display.Bitmap;
- import flash.display.BitmapData;
- public class Main extends Sprite
- {
- private var pen:Sprite=new Sprite();
- private var bmp:BitmapData;
- private var n:int=0;//数量
- private var maxStep:int=100;
- public function Main()
- {
- addChild(pen);
- addEventListener(Event.ENTER_FRAME,Run);
- }
- //绘制心形线
- private function Run(event:Event):void
- {
- (n<=maxStep) ? drawHeart(n,100,new Point(250,200)) : stopDraw();
- n++;
- }
- //停止绘制
- private function stopDraw():void
- {
- removeEventListener(Event.ENTER_FRAME,Run);
- trace("停止");
- }
- //绘制心形
- private function drawHeart(num:int,radius:Number,p:Point):void
- {
- var angle:Number =2*Math.PI /maxStep * num;
- var r:Number = radius*(1+Math.sin(angle));//公式
- var point:Point=Point.polar(r,angle);//极坐标转换笛卡尔坐标
- point.offset(p.x,p.y);//偏移
- trace(point);
- drawLine(pen.graphics,point);
- }
- private function drawLine(g:Graphics,endPoint:Point):void
- {
- g.lineStyle(1);
- if (n==0)
- {
- g.moveTo(endPoint.x,endPoint.y);
- g.lineTo(endPoint.x,endPoint.y);
- }
- if (n>0)
- {
- g.lineTo(endPoint.x,endPoint.y);
- }
- }
- }
- }
根本不同情况绘制四个方向的心,这样就会变成下面的图案。借助了极坐标公式,能够方便我们对这种图形把握,可以更加有方向地通过绘图api描绘出来。这种心形线所创造出来的效果不仅仅是这样的。可以拓宽其他的一些效果,如三维。至于这些效果如何把握,有待慢慢研究。
代码清单:
- package
- {
- //四种方向心形线
- //r=a*(1+cos(angle))
- //r=a*(1-cos(angle))
- //r=a*(1+sin(angle))
- //r=a*(1-sin(angle))
- import flash.display.Sprite;
- import flash.events.*;
- import flash.geom.Point;
- import flash.geom.ColorTransform;
- import flash.display.Graphics;
- import flash.display.Bitmap;
- import flash.display.BitmapData;
- public class Main extends Sprite
- {
- private var pen_up:Sprite;
- private var pen_down:Sprite;
- private var pen_left:Sprite;
- private var pen_right:Sprite;
- private var bmp:BitmapData;
- private var n:int=0;//数量
- private var maxStep:int=100;
- public function Main()
- {
- pen_up=this.clone();
- pen_down=this.clone();
- pen_left=this.clone();
- pen_right=this.clone();
- addChild(pen_up);
- addChild(pen_down);
- addChild(pen_left);
- addChild(pen_right);
- addEventListener(Event.ENTER_FRAME,Run);
- }
- private function clone():Sprite
- {
- return new Sprite();
- }
- //绘制心形线
- private function Run(event:Event):void
- {
- if (n<=maxStep)
- {
- drawHeart(pen_up.graphics,n,100,new Point(250,200),"up");
- drawHeart(pen_down.graphics,n,100,new Point(250,200),"down");
- drawHeart(pen_left.graphics,n,100,new Point(250,200),"left");
- drawHeart(pen_right.graphics,n,100,new Point(250,200),"right");
- }
- else
- {
- stopDraw();
- }
- n++;
- }
- //停止绘制
- private function stopDraw():void
- {
- removeEventListener(Event.ENTER_FRAME,Run);
- trace("停止");
- }
- //绘制心形
- private function drawHeart(g:Graphics,num:int,radius:Number,p:Point,type:String):void
- {
- var angle:Number =2*Math.PI /maxStep * num;
- var r:Number;
- switch (type)
- {
- case "up" :
- r = radius*(1-Math.sin(angle));//上公式
- break;
- case "down" :
- r= radius*(1+Math.sin(angle));//下公式
- break;
- case "left" :
- r = radius*(1-Math.cos(angle));//左公式
- break;
- case "right" :
- r = radius*(1+Math.cos(angle));//右公式
- break;
- }
- var point:Point=Point.polar(r,angle);//极坐标转换笛卡尔坐标
- point.offset(p.x,p.y);//偏移
- trace(point);
- drawLine(g,point);
- }
- private function drawLine(g:Graphics,endPoint:Point):void
- {
- g.lineStyle(1);
- if (n==0)
- {
- g.moveTo(endPoint.x,endPoint.y);
- g.lineTo(endPoint.x,endPoint.y);
- }
- if (n>0)
- {
- g.lineTo(endPoint.x,endPoint.y);
- }
- }
- }
- }