Flash与数学 心形线

分享一下我老师大神的人工智能教程!零基础,通俗易懂!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 描绘每一个点。

我们利用这个方法,将他做一个简单描点动画。如下代码

其中每一个公式里面心形的方向也不会相同的。

不妨自己可以测试一下。好,累了 马上睡觉。第二天再补充。

[c-sharp] view plain copy print ?
  1. package   
  2. {  
  3.     //四种方向心形线  
  4.      //r=a*(1+cos(angle))  
  5.      //r=a*(1-cos(angle))  
  6.      //r=a*(1+sin(angle))  
  7.      //r=a*(1-sin(angle))  
  8.     import flash.display.Sprite;  
  9.     import flash.events.*;  
  10.     import flash.geom.Point;  
  11.     import flash.display.Graphics;  
  12.     import flash.display.Bitmap;  
  13.     import flash.display.BitmapData;  
  14.   
  15.     public class Main extends Sprite  
  16.     {  
  17.         private var pen:Sprite=new Sprite();  
  18.         private var bmp:BitmapData;  
  19.         private var n:int=0;//数量  
  20.         private var maxStep:int=100;  
  21.           
  22.         public function Main()  
  23.         {  
  24.             addChild(pen);  
  25.             addEventListener(Event.ENTER_FRAME,Run);  
  26.         }  
  27.         //绘制心形线  
  28.         private function Run(event:Event):void  
  29.         {  
  30.               
  31.            (n<=maxStep) ? drawHeart(n,100,new Point(250,200)) : stopDraw();  
  32.             n++;  
  33.         }  
  34.           
  35.         //停止绘制  
  36.         private function stopDraw():void  
  37.         {  
  38.              removeEventListener(Event.ENTER_FRAME,Run);  
  39.              trace("停止");  
  40.         }  
  41.           
  42.         //绘制心形  
  43.         private function drawHeart(num:int,radius:Number,p:Point):void  
  44.         {  
  45.             var angle:Number =2*Math.PI /maxStep * num;  
  46.             var r:Number = radius*(1+Math.sin(angle));//公式  
  47.             var point:Point=Point.polar(r,angle);//极坐标转换笛卡尔坐标  
  48.               
  49.             point.offset(p.x,p.y);//偏移  
  50.             trace(point);  
  51.             drawLine(pen.graphics,point);  
  52.         }  
  53.       
  54.         private function drawLine(g:Graphics,endPoint:Point):void  
  55.         {  
  56.             g.lineStyle(1);  
  57.             if (n==0)  
  58.             {  
  59.                 g.moveTo(endPoint.x,endPoint.y);  
  60.                 g.lineTo(endPoint.x,endPoint.y);  
  61.             }  
  62.             if (n>0)  
  63.             {  
  64.                 g.lineTo(endPoint.x,endPoint.y);                  
  65.             }  
  66.         }  
  67.     }  
  68. }  
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描绘出来。这种心形线所创造出来的效果不仅仅是这样的。可以拓宽其他的一些效果,如三维。至于这些效果如何把握,有待慢慢研究。

心

代码清单:

[c-sharp] view plain copy print ?
  1. package   
  2. {  
  3.     //四种方向心形线  
  4.     //r=a*(1+cos(angle))  
  5.     //r=a*(1-cos(angle))  
  6.     //r=a*(1+sin(angle))  
  7.     //r=a*(1-sin(angle))  
  8.     import flash.display.Sprite;  
  9.     import flash.events.*;  
  10.     import flash.geom.Point;  
  11.     import flash.geom.ColorTransform;  
  12.     import flash.display.Graphics;  
  13.     import flash.display.Bitmap;  
  14.     import flash.display.BitmapData;  
  15.   
  16.     public class Main extends Sprite  
  17.     {  
  18.         private var pen_up:Sprite;  
  19.         private var pen_down:Sprite;  
  20.         private var pen_left:Sprite;  
  21.         private var pen_right:Sprite;  
  22.   
  23.         private var bmp:BitmapData;  
  24.         private var n:int=0;//数量  
  25.         private var maxStep:int=100;  
  26.         public function Main()  
  27.         {  
  28.               
  29.             pen_up=this.clone();  
  30.             pen_down=this.clone();  
  31.             pen_left=this.clone();  
  32.             pen_right=this.clone();  
  33.               
  34.             addChild(pen_up);  
  35.             addChild(pen_down);  
  36.             addChild(pen_left);  
  37.             addChild(pen_right);  
  38.   
  39.             addEventListener(Event.ENTER_FRAME,Run);  
  40.         }  
  41.           
  42.         private function clone():Sprite  
  43.         {  
  44.             return new Sprite();              
  45.         }  
  46.               
  47.         //绘制心形线  
  48.         private function Run(event:Event):void  
  49.         {  
  50.             if (n<=maxStep)  
  51.             {  
  52.                 drawHeart(pen_up.graphics,n,100,new Point(250,200),"up");  
  53.                 drawHeart(pen_down.graphics,n,100,new Point(250,200),"down");  
  54.                 drawHeart(pen_left.graphics,n,100,new Point(250,200),"left");  
  55.                 drawHeart(pen_right.graphics,n,100,new Point(250,200),"right");  
  56.             }  
  57.             else  
  58.             {  
  59.                 stopDraw();  
  60.             }  
  61.   
  62.             n++;  
  63.         }  
  64.         //停止绘制  
  65.         private function stopDraw():void  
  66.         {  
  67.             removeEventListener(Event.ENTER_FRAME,Run);  
  68.             trace("停止");  
  69.   
  70.         }  
  71.         //绘制心形  
  72.         private function drawHeart(g:Graphics,num:int,radius:Number,p:Point,type:String):void  
  73.         {  
  74.             var angle:Number =2*Math.PI /maxStep * num;  
  75.             var r:Number;  
  76.             switch (type)  
  77.             {  
  78.                 case "up" :  
  79.                     r = radius*(1-Math.sin(angle));//上公式  
  80.                     break;  
  81.                 case "down" :  
  82.                     r= radius*(1+Math.sin(angle));//下公式  
  83.                     break;  
  84.                 case "left" :  
  85.                     r = radius*(1-Math.cos(angle));//左公式  
  86.                     break;  
  87.                 case "right" :  
  88.                     r = radius*(1+Math.cos(angle));//右公式  
  89.                     break;  
  90.             }  
  91.             var point:Point=Point.polar(r,angle);//极坐标转换笛卡尔坐标  
  92.   
  93.             point.offset(p.x,p.y);//偏移  
  94.             trace(point);  
  95.             drawLine(g,point);  
  96.         }  
  97.         private function drawLine(g:Graphics,endPoint:Point):void  
  98.         {  
  99.             g.lineStyle(1);  
  100.             if (n==0)  
  101.             {  
  102.                 g.moveTo(endPoint.x,endPoint.y);  
  103.                 g.lineTo(endPoint.x,endPoint.y);  
  104.             }  
  105.             if (n>0)  
  106.             {  
  107.                 g.lineTo(endPoint.x,endPoint.y);  
  108.             }  
  109.         }  
  110.     }  
  111. }  
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);   }  } }}

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

这里写图片描述

猜你喜欢

转载自blog.csdn.net/truhfcg/article/details/83919974
今日推荐