canvas畫一個可旋轉的太極八卦圖案

想畫一個純canvas的太極圖案,搜了好久也沒找到好的,索性自己畫了一個,廢話不多說因宇,直接上代碼。

HTML部分

<canvas id="myCanvas"></canvas>

JS部分

let canvas = document.getElementById('myCanvas');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
canvas.style.backgroundColor = "#fff";
ctx = canvas.getContext('2d');

let taijiNum = 0, recNum = 0, lineNum = 0

// 八邊形框
function drawOutline (){
    lineNum += 1
    let lineDeg = lineNum * Math.PI/360
                
    ctx.beginPath()
    ctx.lineJoin = 'round'

    for(let i = 0; i < 8; i++){
        ctx.lineTo(400+320*Math.cos(lineDeg + Math.PI/8+ Math.PI/4*i), 400-320*Math.sin(lineDeg + Math.PI/8+ Math.PI/4*i))
    }
                
    ctx.closePath()
    ctx.lineWidth = 10
    ctx.strokeStyle = "#333"
    ctx.stroke()
}

// 畫太極
function drawTaiji (){
    taijiNum -= Math.PI/360

    // 大圓描邊
    ctx.beginPath()
    ctx.arc(400, 400, 160, 0, Math.PI*2);
    ctx.lineWidth = 1
    ctx.strokeStyle = "#333"
    ctx.stroke()

    // 左邊半圓
    ctx.fillStyle = '#333'
    ctx.beginPath()
    ctx.arc(400, 400, 160, taijiNum + Math.PI*0.5, taijiNum + Math.PI*1.5);
    ctx.fill()

    // 右邊半圓
    ctx.fillStyle = '#fff'
    ctx.beginPath()
    ctx.arc(400, 400, 160, taijiNum + Math.PI*0.5, taijiNum + Math.PI*1.5, true)
    ctx.fill()

    // 上半邊
    ctx.fillStyle = '#fff'
    ctx.beginPath()
    ctx.arc(400 - 80*Math.sin(taijiNum), 400 + 80*Math.cos(taijiNum), 80, taijiNum + Math.PI*0.5, taijiNum + Math.PI*1.5)
    ctx.fill()
    // 清除間隔線條
    ctx.beginPath()
    ctx.moveTo(400 - 160*Math.sin(taijiNum), 400 + 160*Math.cos(taijiNum))
    ctx.lineTo(400, 400)
    ctx.lineWidth = 2
    ctx.strokeStyle = '#fff'
    ctx.stroke()

    // 下半邊
    ctx.fillStyle = '#333'
    ctx.beginPath()
    ctx.arc(400 + 80*Math.sin(taijiNum), 400 - 80*Math.cos(taijiNum), 80, taijiNum + Math.PI*0.5, taijiNum + Math.PI*1.5, true)
    ctx.fill()

    // 清除間隔線條
    ctx.beginPath()
    ctx.moveTo(400 + 160*Math.sin(taijiNum), 400 - 160*Math.cos(taijiNum))
    ctx.lineTo(400, 400)
    ctx.strokeStyle = '#333'
    ctx.stroke()

    // 上邊小圓
    ctx.fillStyle = '#333'
    ctx.beginPath()
    ctx.arc(400 - 80*Math.sin(taijiNum), 400 + 80*Math.cos(taijiNum), 16, 0, Math.PI*2)
    ctx.fill()

    // 下邊小圓
    ctx.fillStyle = '#fff'
    ctx.beginPath()
    ctx.arc(400 + 80*Math.sin(taijiNum), 400 - 80*Math.cos(taijiNum), 16, 0, Math.PI*2)
    ctx.fill()
}

// 畫方格
function drawRec (){
    let arcNum = Math.PI*2/8
    let colors = ['red', 'blue', 'green', 'pink', 'gray', 'orange', 'yellow', 'violet']
    recNum += Math.PI/360

    for(let i = 0; i < 8; i++){
        let arc = recNum + arcNum / 2 + i*arcNum
        ctx.save()
        
        ctx.translate(400 + 260*Math.cos(arc+arcNum/2), 400 + 260*Math.sin(arc+arcNum/2));
        // rotate方法旋轉當前的繪圖
        ctx.rotate(arc + arcNum / 2 + Math.PI / 2);

        // ctx.fillStyle = colors[i]
        ctx.fillStyle = '#333'
        ctx.fillRect(-50, 0, 100, 10)
        ctx.fillRect(-50, 20, 100, 10)
        ctx.fillRect(-50, 40, 100, 10)

        ctx.fillStyle = '#fff'
        
        if (i === 0){
            ctx.fillRect(-15, 39, 30, 12)
        }else if (i === 1){
            ctx.fillRect(-15, -1, 30, 12)
            ctx.fillRect(-15, 39, 30, 12)
        }else if (i === 2){
            ctx.fillRect(-15, 19, 30, 12)
            ctx.fillRect(-15, 39, 30, 12)
        }else if (i === 3){
            ctx.fillRect(-15, -1, 30, 12)
            ctx.fillRect(-15, 19, 30, 12)
            ctx.fillRect(-15, 39, 30, 12)
        }else if (i === 4){
            ctx.fillRect(-15, -1, 30, 12)
            ctx.fillRect(-15, 19, 30, 12)
        }else if (i === 5){
            ctx.fillRect(-15, 19, 30, 12)
        }else if (i === 6){
            ctx.fillRect(-15, -1, 30, 12)
        }else {

        }

        ctx.restore()
    }
}

function draw (){
    ctx.globalCompositeOperation = 'source-over'
    ctx.clearRect(0, 0, 800, 800)
    drawOutline()
    drawTaiji()
    drawRec()

    window.requestAnimationFrame(draw)
}

draw()

效果圖:


太極.gif
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末祟偷,一起剝皮案震驚了整個濱河市察滑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌修肠,老刑警劉巖贺辰,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異嵌施,居然都是意外死亡饲化,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門吗伤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吃靠,“玉大人,你說我怎么就攤上這事足淆〕部椋” “怎么了捺球?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長夕冲。 經常有香客問我,道長裂逐,這世上最難降的妖魔是什么歹鱼? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮卜高,結果婚禮上弥姻,老公的妹妹穿的比我還像新娘。我一直安慰自己掺涛,他們只是感情好庭敦,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著薪缆,像睡著了一般秧廉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拣帽,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天疼电,我揣著相機與錄音,去河邊找鬼减拭。 笑死蔽豺,一個胖子當著我的面吹牛,可吹牛的內容都是我干的拧粪。 我是一名探鬼主播修陡,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼可霎!你這毒婦竟也來了魄鸦?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤癣朗,失蹤者是張志新(化名)和其女友劉穎号杏,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斯棒,經...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡盾致,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了荣暮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庭惜。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖穗酥,靈堂內的尸體忽然破棺而出护赊,到底是詐尸還是另有隱情惠遏,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布骏啰,位于F島的核電站节吮,受9級特大地震影響,放射性物質發(fā)生泄漏判耕。R本人自食惡果不足惜透绩,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望壁熄。 院中可真熱鬧帚豪,春花似錦、人聲如沸草丧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昌执。三九已至烛亦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間懂拾,已是汗流浹背此洲。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留委粉,地道東北人呜师。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像贾节,于是被迫代替她去往敵國和親汁汗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內容