HTML5 Canvas隨機(jī)圓周運(yùn)動(dòng)

圓周運(yùn)動(dòng)的原理

圓周運(yùn)動(dòng)1.PNG
如上圖所示慈参,其實(shí)圓周運(yùn)動(dòng)夷陋,就是通過運(yùn)動(dòng)的角度deg來求出物體在x軸和y軸上運(yùn)動(dòng)的偏移量饥臂,分別為radius*Math.cos(deg)radius*Math.sin(deg)夺刑。

了解了上述原理之后愉棱,就可以開始寫一個(gè)隨機(jī)圓周運(yùn)動(dòng)的DEMO,效果圖如下

圓周運(yùn)動(dòng).PNG

基本的設(shè)計(jì)思路

*利用面向?qū)ο蟮乃枷雱?chuàng)建一個(gè)圓模型對(duì)象还蹲。
*再創(chuàng)建一個(gè)幀動(dòng)畫模型爹耗。
*創(chuàng)建實(shí)例耙考,執(zhí)行動(dòng)畫。

創(chuàng)建圓模型對(duì)象

將畫圓形的x,y坐標(biāo)潭兽、半徑倦始、初始角度、顏色山卦、寬度等要素鞋邑,封裝在圓模型這個(gè)對(duì)象的構(gòu)造函數(shù)里面,然后通過給原型添加方法账蓉,一個(gè)是draw畫圓形的方法和move圓形運(yùn)動(dòng)的方法枚碗,讓所有圓形的實(shí)例共享這些方法,還有自己相應(yīng)的屬性铸本,這里用到了肮雨,構(gòu)造函數(shù)模式和原型模式創(chuàng)建對(duì)象的方法思想。

var Square = function(x,y,radiu,option){
        this.wid = canvas.width;
        this.hei = canvas.height;
        this.ctx = ctx;
        this.x = x;
        this.y = y;
        this.radiu = radiu;
        this.option = option;
        this.radius = Math.random()*5 + 1;
        this.angle = 0;//圓周運(yùn)動(dòng)的初始角度
    };
    Square.prototype = {
        draw:function(){
            this.ctx.beginPath();
            this.ctx.strokeStyle = this.option.strokeStyle;
            this.ctx.lineWidth = this.option.lineWidth;
            this.ctx.arc(this.x,this.y,this.radiu,0,2*Math.PI,true);
            this.ctx.stroke();
        },
        move:function(){
            /*根據(jù)角度計(jì)算出x軸和y軸的偏移量*/
            this.x += this.radius*Math.cos(this.angle*(Math.PI/180));
            this.y += this.radius*Math.sin(this.angle*(Math.PI/180));
            this.angle+=5;//角度每次遞增5個(gè)像素
            this.draw();
        }
    };

創(chuàng)建幀動(dòng)畫對(duì)象

同樣的道理創(chuàng)建幀動(dòng)畫對(duì)象归敬,并且增加一個(gè)存放圓實(shí)例的數(shù)組酷含,每實(shí)例化一個(gè)圓形,就將它存到數(shù)組中汪茧,然后每次render渲染之前,都先把之前的畫布清除掉限番,然后執(zhí)行start方法循環(huán)地渲染畫布舱污,達(dá)到動(dòng)畫的效果。

var Far = function(){
        this.width = canvas.width;
        this.height = canvas.height;
        this.ctx = ctx;
        this.timer = null;
        this.squares = [];//創(chuàng)建數(shù)組弥虐,用于存放圓實(shí)例
    };
    Far.prototype = {
        //循環(huán)渲染
        start : function(){
            this.timer = setInterval((function(param){
                return function(){param.render();}
            })(this),30);
        },
        //渲染方法
        render : function(){
            /*將之前的畫布清除掉*/
            this.ctx.clearRect(0,0,canvas.width,canvas.height);
            /*遍歷每個(gè)圓實(shí)例扩灯,讓這些圓角度發(fā)生變化,從而讓運(yùn)動(dòng)軌跡發(fā)送變化*/
            for(i in this.squares){
                this.squares[i].move();
                /*圓角度增加判斷*/
                if(this.squares[i].angle>360){
                    this.squares[i].angle = 0;
                }
            }
        }
    };

最后創(chuàng)建實(shí)例完成動(dòng)畫效果

/*創(chuàng)建幀實(shí)例*/
    var frame = new Far();
    /*創(chuàng)建圓實(shí)例*/
    for(var i=0;i<500;i++){
        /*圓的所有屬性都是一定范圍內(nèi)的隨機(jī)數(shù)*/
        var x = Math.random()*(canvas.width);
        var y = Math.random()*(canvas.height);
        var radiu = Math.random()*20;
        var r = Math.floor(Math.random()*256);
        var g = Math.floor(Math.random()*256);
        var b = Math.floor(Math.random()*256);
        var a = Math.random();
        var option = {
            strokeStyle : 'rgba('+r+','+g+','+b+','+a+')',
            lineWidth : Math.random()*10
        };
        //把圓實(shí)例放到幀模型的數(shù)組中
        frame.squares[i] = new Square(x,y,radiu,option);
    }
    //開始渲染
    frame.start();

完整代碼地址:https://github.com/McRayFE/CanvasCircle

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末霜瘪,一起剝皮案震驚了整個(gè)濱河市珠插,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌颖对,老刑警劉巖捻撑,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異缤底,居然都是意外死亡顾患,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門个唧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來江解,“玉大人,你說我怎么就攤上這事徙歼±绾樱” “怎么了鳖枕?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長桨螺。 經(jīng)常有香客問我耕魄,道長,這世上最難降的妖魔是什么彭谁? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任吸奴,我火速辦了婚禮,結(jié)果婚禮上缠局,老公的妹妹穿的比我還像新娘则奥。我一直安慰自己,他們只是感情好狭园,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布读处。 她就那樣靜靜地躺著,像睡著了一般唱矛。 火紅的嫁衣襯著肌膚如雪罚舱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天绎谦,我揣著相機(jī)與錄音管闷,去河邊找鬼。 笑死窃肠,一個(gè)胖子當(dāng)著我的面吹牛包个,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播冤留,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼碧囊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了纤怒?” 一聲冷哼從身側(cè)響起糯而,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎泊窘,沒想到半個(gè)月后熄驼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡州既,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年谜洽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吴叶。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡阐虚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚌卤,到底是詐尸還是另有隱情实束,我是刑警寧澤奥秆,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站咸灿,受9級(jí)特大地震影響构订,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜避矢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一悼瘾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧审胸,春花似錦亥宿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碍庵,卻和暖如春映企,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背静浴。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工堰氓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人马绝。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓豆赏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親富稻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容