canvas繪制星空曹锨,月亮沛简,大地覆享,添加文字

先上最終效果圖:

最終實現(xiàn)效果

我們分為四部分來畫該效果营袜。
1.一片星空
星空效果圖如下:

星空效果圖

我們分析一下這片星空荚板,首先星星都分布在頁面三分之二及以上位置,星星大小不一拧抖,旋轉(zhuǎn)角度不一唧席,在頁面中間嘲驾,有散射的藍色天空效果。
好了徒仓,讓我們按所分析的注意點來試著畫一片星空誊垢。
不過症见,這其中最最重要的一點谋作,就是學(xué)會畫一個五角星壁晒。
運用初高中數(shù)學(xué)知識計算出五角星每一個折點的坐標秒咐,具體函數(shù)如下携取,即畫出了一個正正方方的五角星帮孔。
下面是一個簡易圖,有興趣的可以自己畫圖計算一下各個頂點值晤斩。

五角星輔助線圖

根據(jù)計算澳泵,我們依次得出10個頂點值兼呵,并畫出一個正的五角星,代碼如下所示:

function setPath(cxt){
    cxt.beginPath();
    for (var i = 0; i < 5; i++) {
        cxt.lineTo(
            Math.cos((18 + i * 72 ) / 180 * Math.PI) * 10 ,
            -Math.sin((18 + i * 72 ) / 180 * Math.PI) * 10
        );

        cxt.lineTo(
            Math.cos((54 + i * 72) / 180 * Math.PI) * 5 ,
            -Math.sin((54 + i * 72 ) / 180 * Math.PI) * 5
        );
    }
    cxt.closePath();
}

畫出了一個五角星后维苔,我們應(yīng)該思考一下這個五角星的旋轉(zhuǎn)及放大縮小變化介时,使用canvas的rotate方法進行旋轉(zhuǎn)變化凌彬,使用scale進行縮放變化,具體代碼如下所示:

function drawStar(cxt, R, x, y, rot) {
    cxt.save();

    cxt.translate(x,y);
    cxt.rotate(rot/180*Math.PI);
    cxt.scale(R,R);

    setPath(cxt)
    cxt.fillStyle = "#fb3";

    cxt.fill();
    cxt.restore();
}

至此勉失,我們就可以重復(fù)使用該方法原探,借用隨機值,畫出一片星空:

for (var i = 0; i < 400; i++) {
        var r = Math.random();
        var x = Math.random() * canvas.width;
        var y = Math.random() * canvas.height*0.6;
        var rot = Math.random() * 360;
        drawStar(context, r, x, y, rot);

    }

下來徒蟆,讓我們?yōu)檫@片星空調(diào)以天空的顏色。

  var linearGard=context.createRadialGradient(canvas.width/2,canvas.height,0,canvas.width/2,canvas.height,canvas.height);
    linearGard.addColorStop(1.0,"black");

    linearGard.addColorStop(0.0,"#148EFB");
    context.fillStyle = linearGard;
    context.fillRect(0, 0, canvas.width, canvas.height);

至此全蝶,我們的一片星空抑淫,就畫完了姥闪。
2.一輪彎月
在上面一片星空的基礎(chǔ)上,我們增加一輪彎月催式,效果圖如下所示:

星空彎月

彎月荣月,即為兩條圓弧梳毙,我們可以根據(jù)下圖所做輔助線中角的tan值相等來列方程式進行計算。

tan

最終代碼如下所示堂氯,rot為旋轉(zhuǎn)角度咽白,fillColor的填充色鸟缕。

function fillMoon(cxt,x1,y1,x2,y2,r,/*option*/rot,/*option*/fillColor){
cxt.save();
    cxt.beginPath();
    cxt.rotate(rot/180*Math.PI);
    // 創(chuàng)建開始點

    cxt.arc(x1,y1,r,0.5*Math.PI,1.5*Math.PI,true);
    cxt.moveTo(x1,y1-r);
    cxt.arcTo(x2,y2,x1,y1+r,dis(r,x2-x1)); // 創(chuàng)建弧
    cxt.fillStyle=fillColor||"#fb3";

    cxt.fill();
cxt.restore();
}

3.大地

在以上基礎(chǔ)上,我們增加了一片大地授段,效果圖如下所示:

星空彎月大地

畫大地最主要的便是使用bezierCurveTo方法進行曲線的繪制侵贵,bezierCurveTo內(nèi)的參數(shù)是經(jīng)過計算得來的缘薛。landStyle為該圖形著色卡睦。
代碼如下:

function drawLand(cxt){
    cxt.save();
    cxt.beginPath();
    cxt.moveTo(0,600);
    cxt.bezierCurveTo(540,400,660,800,1430,600);
    cxt.lineTo(1430,800);
    cxt.lineTo(0,800);
    cxt.closePath();

    var landStyle=cxt.createLinearGradient(0,800,0,0);
    landStyle.addColorStop(0,"#030");
    landStyle.addColorStop(1,"#580");
    cxt.fillStyle=landStyle;
    cxt.fill();


    cxt.restore();

}

4.文字

到了最后一步表锻,也就是最簡單的一步了瞬逊。
設(shè)置文字的大小仪或,顏色,使用fillText進行文字繪制即可骚腥。

    CXT.save();
    CXT.font="bold 20px Georgia";
    CXT.fillStyle="#fff";
    CXT.fillText("Canvas文字繪制",200,650);
    CXT.fillText("——海上月_天上月",500,700);
    CXT.restore();
}```
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市廓块,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌带猴,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件靶病,死亡現(xiàn)場離奇詭異娄周,居然都是意外死亡沪停,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門众辨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舷礼,“玉大人,你說我怎么就攤上這事妻献⊥帕蓿” “怎么了然痊?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵剧浸,是天一觀的道長矗钟。 經(jīng)常有香客問我,道長吨艇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任冯吓,我火速辦了婚禮组贺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘失尖。我一直安慰自己渐苏,他們只是感情好,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布仪吧。 她就那樣靜靜地躺著邑商,像睡著了一般。 火紅的嫁衣襯著肌膚如雪人断。 梳的紋絲不亂的頭發(fā)上朝蜘,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機與錄音步做,去河邊找鬼。 笑死全度,一個胖子當著我的面吹牛斥滤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播顶掉,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼痒筒,長吁一口氣:“原來是場噩夢啊……” “哼茬贵!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起解藻,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤舆逃,失蹤者是張志新(化名)和其女友劉穎戳粒,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奄妨,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡砸抛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年树枫,在試婚紗的時候發(fā)現(xiàn)自己被綠了直焙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡奔誓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出厨喂,到底是詐尸還是另有隱情,我是刑警寧澤派阱,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布贫母,位于F島的核電站,受9級特大地震影響颁独,放射性物質(zhì)發(fā)生泄漏伪冰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一靠柑、第九天 我趴在偏房一處隱蔽的房頂上張望吓懈。 院中可真熱鬧,春花似錦隔嫡、人聲如沸甘穿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽募判。三九已至,卻和暖如春释液,著一層夾襖步出監(jiān)牢的瞬間敦腔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工糟袁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人项戴。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓周叮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親仿耽。 傳聞我的和親對象是個殘疾皇子各薇,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

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