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ù)過多時(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)文章
微信二次分享報(bào)錯(cuò)invalid signature問題及解決方法
基于微信公眾號(hào)開發(fā)的h5頁(yè)面(使用jssdk接口),由用戶A分享給用戶B,用戶B再次分享這個(gè)頁(yè)面時(shí),不能成功分享。這篇文章主要介紹了微信二次分享報(bào)錯(cuò)invalid signature問題及解決方法,需要的朋友可以參考下2019-04-04
js點(diǎn)擊按鈕實(shí)現(xiàn)多張圖片循環(huán)切換
這篇文章主要為大家詳細(xì)介紹了js點(diǎn)擊按鈕實(shí)現(xiàn)多張圖片循環(huán)切換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
JS實(shí)現(xiàn)根據(jù)當(dāng)前文字選擇返回被選中的文字
這篇文章主要介紹JS如何實(shí)現(xiàn)根據(jù)當(dāng)前文字選擇返回被選中的文字,需要的朋友可以參考下2014-05-05
javascript簡(jiǎn)單寫的判斷電話號(hào)碼實(shí)例
這篇文章主要介紹了javascript簡(jiǎn)單寫的判斷電話號(hào)碼實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05
ES6基礎(chǔ)之解構(gòu)賦值(destructuring assignment)
這篇文章主要介紹了ES6基礎(chǔ)之解構(gòu)賦值(destructuring assignment),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-02-02
DB.ASP 用Javascript寫ASP很靈活很好用很easy
DB.ASP 用Javascript寫ASP很靈活很好用很easy,喜歡用js寫asp的朋友可以參考下。2011-07-07
原生微信小程序中封裝一個(gè)模擬select下拉框組件代碼示例
這篇文章主要給大家介紹了關(guān)于原生微信小程序中封裝一個(gè)模擬select下拉框組件的相關(guān)資料,文中介紹了如何在小程序中創(chuàng)建和使用自定義組件van-select,包括組件的創(chuàng)建步驟和在頁(yè)面中的應(yīng)用方法,需要的朋友可以參考下2024-11-11
前端截圖幾種常用實(shí)現(xiàn)方式總結(jié)
這篇文章主要介紹了前端截圖幾種常用實(shí)現(xiàn)方式,包括使用HTML5的canvas和html2canvas庫(kù)、瀏覽器API以及結(jié)合后端服務(wù),每種方法都有其優(yōu)缺點(diǎn),大家可以根據(jù)需求選擇方法,需要的朋友可以參考下2025-03-03

