1. 程式人生 > >Flash與數學 心形線

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

這裡寫圖片描述