Flash與數學 心形線
阿新 • • 發佈:2018-12-04
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!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 ?
- 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 ?- 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);
- }
- }
- }
- }