JavaScript?Canvas繪制六邊形網(wǎng)格
本文實(shí)例為大家分享了JavaScript Canvas繪制六邊形網(wǎng)格的具體代碼,供大家參考,具體內(nèi)容如下
使用Canvas繪制六邊形網(wǎng)格。
主要思路是先畫給定中心點(diǎn)的六邊形,然后二重循環(huán)遍歷所有中心點(diǎn),畫所有的六邊形。
<!DOCTYPE HTML> <html> <body> <canvas id="myCanvas" width="300" height="150"> ? ? <p>你的瀏覽器不支持Canvas</p> </canvas> <br> <p id='p1'></p> <script type="text/javascript"> "use strict"; var canvas=document.getElementById('myCanvas'); if (canvas.getContext) { ? ? var k=3; ? ? var d=30; ? ? var w=Math.sqrt(3)*d; ? ? var h=3/2*d; ? ? canvas.width=2*k*w; ? ? canvas.height=2*k*h+h/2; ? ? var o=[canvas.width/2,canvas.height/2]; ? ? document.getElementById('p1').innerHTML='畫布寬'+canvas.width+',高'+canvas.height; ? ? var ctx=canvas.getContext('2d'); ? ? ctx.fillStyle='AntiqueWhite'; ? ? ctx.fillRect(0,0,canvas.width,canvas.height); ? ? ctx.strokeStyle='blue'; ? ? ctx.beginPath(); ? ? var vs=[[0,d],[-w/2,d/2],[-w/2,-d/2], ? ? ? ? ? ? [0,-d],[w/2,-d/2],[w/2,d/2]]; ? ? function one(xo,yo){ ? ? ? ? ctx.moveTo(xo+vs[5][0],yo+vs[5][1]); ? ? ? ? for(var i=0;i<vs.length;i++){ ? ? ? ? ? ? ctx.lineTo(xo+vs[i][0],yo+vs[i][1]); ? ? ? ? } ? ? } ? ? for(var i=-k+1;i<k;i++){ ? ? ? ? for(var j=0;j<2*k-1-Math.abs(i);j++){ ? ? ? ? ? ? one(o[0]+(-k+1+Math.abs(i)/2+j)*w,o[1]+h*i); ? ? ? ? } ? ? } ? ? ctx.stroke(); } else{ ? ? console.log('你的瀏覽器不支持Canvas'); } </script> </body> </html>
效果如下:
更新:增加了一些選項(xiàng),邊長(zhǎng)和顏色可以設(shè)置。網(wǎng)頁(yè)的圖標(biāo)也用六邊形畫出。
<!DOCTYPE HTML> <html> <head> <title>六邊形網(wǎng)格</title> <link id="link" rel="shortcut icon" type="image/x-icon"> <style> #bc1,#bc2{width:25px;} #bj,#xt,#tc{width:20px;} </style> </head> <body> <p>設(shè)置大六邊形邊長(zhǎng): <input id='bc1' value="3" onchange="generate()"> 小六邊形<br> 設(shè)置小六邊形邊長(zhǎng): <input id='bc2' value="24" onchange="generate()"> 像素(px)<br> 設(shè)置背景色 <input type="color" id="bj" value="#c8ffff" onchange="generate()"/> 設(shè)置線條色 <input type="color" id="xt" value="#0000ff" onchange="generate()"/> 設(shè)置填充色 <input type="color" id="tc" value="#faebd7" onchange="generate()"/></p> <p id='p1'></p> <canvas id="myCanvas" width="300" height="150"> <p>你的瀏覽器不支持Canvas</p> </canvas> <script type="text/javascript"> "use strict"; document.getElementById('bc1').value=2; generate(); link.href=myCanvas.toDataURL({format:'image/png', quality:1}); document.getElementById('bc1').value=3; generate(); function generate(){ ? ? var bc1=document.getElementById('bc1').value; ? ? var bc2=document.getElementById('bc2').value; ? ? var k=Number(bc1); ? ? var d=Number(bc2); ? ? var bj=document.getElementById('bj').value; ? ? var xt=document.getElementById('xt').value; ? ? var tc=document.getElementById('tc').value; ? ? var canvas=document.getElementById('myCanvas'); ? ? if(bc1>200){ ? ? ? ? var c=confirm('六邊形個(gè)數(shù)過(guò)多時(shí)網(wǎng)頁(yè)會(huì)卡,是否繼續(xù)?'); ? ? ? ? if(!c){ ? ? ? ? ? ? return; ? ? ? ? } ? ? } ? ? if(canvas.getContext) { ? ? ? ? var w=Math.sqrt(3)*d; ? ? ? ? var h=3/2*d; ? ? ? ? var count=3*k*k-3*k+1; ? ? ? ? canvas.width=2*k*w; ? ? ? ? canvas.height=2*k*h+h/2; ? ? ? ? var o=[canvas.width/2,canvas.height/2]; ? ? ? ? document.getElementById('p1').innerHTML='畫布寬'+canvas.width+'px,高'+canvas.height+'px,含有'+count+'個(gè)小六邊形'; ? ? ? ? var ctx=canvas.getContext('2d'); ? ? ? ? ctx.fillStyle=bj; ? ? ? ? ctx.fillRect(0,0,canvas.width,canvas.height); ? ? ? ? ctx.beginPath(); ? ? ? ? var vs=[[0,d],[-w/2,d/2],[-w/2,-d/2],[0,-d],[w/2,-d/2],[w/2,d/2]]; ? ? ? ? function one(xo,yo){ ? ? ? ? ? ? ctx.beginPath(); ? ? ? ? ? ? ctx.moveTo(xo+vs[5][0],yo+vs[5][1]); ? ? ? ? ? ? for(var i=0;i<vs.length;i++){ ? ? ? ? ? ? ? ? ctx.lineTo(xo+vs[i][0],yo+vs[i][1]); ? ? ? ? ? ? } ? ? ? ? ? ? ctx.strokeStyle=xt; ? ? ? ? ? ? ctx.lineWidth=2; ? ? ? ? ? ? ctx.stroke(); ? ? ? ? ? ? ctx.fillStyle=tc; ? ? ? ? ? ? ctx.fill(); ? ? ? ? } ? ? ? ? for(var i=-k+1;i<k;i++){ ? ? ? ? ? ? for(var j=0;j<2*k-1-Math.abs(i);j++){ ? ? ? ? ? ? ? ? one(o[0]+(-k+1+Math.abs(i)/2+j)*w,o[1]+h*i); ? ? ? ? ? ? } ? ? ? ? } ? ? } ? ? else{ ? ? ? ? console.log('你的瀏覽器不支持Canvas'); ? ? } } </script> </body> </html>
效果如下:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Three.js學(xué)習(xí)之網(wǎng)格
- JavaScript實(shí)現(xiàn)拖拽元素對(duì)齊到網(wǎng)格(每次移動(dòng)固定距離)
- 分享十三個(gè)最佳JavaScript數(shù)據(jù)網(wǎng)格庫(kù)
- 原生JS實(shí)現(xiàn)圖片網(wǎng)格式漸顯、漸隱效果
- Vue.js實(shí)現(xiàn)網(wǎng)格列表布局轉(zhuǎn)換方法
- Three.js中網(wǎng)格對(duì)象MESH的屬性與方法詳解
- Javascript Bootstrap的網(wǎng)格系統(tǒng),導(dǎo)航欄和輪播詳解
- JavaScript網(wǎng)格中的最小路徑講解
相關(guān)文章
使用BootStrap實(shí)現(xiàn)懸浮窗口的效果
本文給大家分享使用BootStrap實(shí)現(xiàn)懸浮窗口的效果,神奇的 bootstrap就自帶了這個(gè)功能。所以就用bootstrap的popover插件做了,效果還不錯(cuò),感興趣的朋友參考下吧2016-12-12為什么JavaScript中0.1 + 0.2 != 0.3
這篇文章主要給大家介紹了關(guān)于為什么JavaScript中0.1 + 0.2 != 0.3的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12Javascript的表單與驗(yàn)證-非空驗(yàn)證
JavaScript 可用來(lái)在數(shù)據(jù)被送往服務(wù)器前對(duì) HTML 表單中的這些輸入數(shù)據(jù)進(jìn)行驗(yàn)證。本文給大家介紹javascript的表單與驗(yàn)證-非空驗(yàn)證,對(duì)javascript表單驗(yàn)證相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-03-03如何通過(guò)遞歸方法實(shí)現(xiàn)用json-diff渲染json字符串對(duì)比結(jié)果
JsonDiff是一個(gè)高性能json差異發(fā)現(xiàn)工具,它幾乎可以發(fā)現(xiàn)任何JSON結(jié)構(gòu)的差異,并且將錯(cuò)誤信息反饋給用戶,下面這篇文章主要給大家介紹了關(guān)于如何通過(guò)遞歸方法實(shí)現(xiàn)用json-diff渲染json字符串對(duì)比結(jié)果的相關(guān)資料,需要的朋友可以參考下2022-12-12十個(gè)優(yōu)秀的Ajax/Javascript實(shí)例網(wǎng)站收集
今天,要向大家推薦10個(gè)相當(dāng)棒的Ajax和Javascript國(guó)外資源網(wǎng)站或博客,它們提供了相當(dāng)多的高質(zhì)量Ajax、Javascript實(shí)例及教程,喜歡Ajax和Javascript的朋友絕對(duì)不能錯(cuò)過(guò)。2010-03-03重學(xué)JS之顯示強(qiáng)制類型轉(zhuǎn)換詳解
這篇文章主要給大家介紹了關(guān)于重學(xué)JS之顯示強(qiáng)制類型轉(zhuǎn)換的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用JS具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06javascript 強(qiáng)制刷新頁(yè)面的實(shí)現(xiàn)代碼
javascript 強(qiáng)制刷新頁(yè)面的代碼,大家經(jīng)常能用的到。2009-12-12