亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > HTML > 正文

canvas像素畫板的實(shí)現(xiàn)代碼

2024-08-26 00:21:09
字體:
供稿:網(wǎng)友

最近項(xiàng)目上要實(shí)現(xiàn)一個類似像素風(fēng)格的畫板,可以像素小格子可以擦除,框選變色,可以擦出各種圖形,這樣一個小項(xiàng)目看似簡單,包含的東西還真不少。

繪制像素格子

我們先定義像素格子類

Pixel = function (option) {    this.x = option.x;    this.y = option.y;    this.shape = option.shape;    this.size = option.size || 8;}

x和y表示中心點(diǎn)坐標(biāo),一開始我是這么做的,先定義路徑

createPath: function (ctx) {			if (this.shape === 'circle') {				this.createCircle(ctx);			} else if (this.shape === 'rect') {				this.createRect(ctx);			} else {				this.createCircle(ctx);			}		},		createCircle: function (ctx) {			var radius = this.size / 2;			ctx.arc(this.x,this.y,radius,0,Math.PI*2);		},		createRect: function (ctx) {			var points = this.getPoints();            points.forEach(function (point, i) {                ctx[i == 0 ? 'moveTo' : 'lineTo'](point.x, point.y);            })            ctx.lineTo(points[0].x, points[0].y);		},

像素網(wǎng)格支持圓形和矩形,路徑定義好后,然后進(jìn)行繪制

draw: function (ctx) {			ctx.save();			ctx.lineWidth=this.lineWidth;			ctx.strokeStyle=this.strokeStyle;			ctx.fillStyle=this.fillStyle;			ctx.beginPath();			this.createPath(ctx);			ctx.stroke();			if(this.isFill){ctx.fill();}			ctx.restore();		}

然后通過循環(huán)批量創(chuàng)建像素網(wǎng)格:

for (var i = stepX + .5; i < canvas.width; i+=stepX) {		for (var j = stepY + .5; j < canvas.height; j+=stepY) {			var pixel = new Pixel({				x: i,				y: j,				shape: 'circle'			})			box.push(pixel);			pixel.draw(ctx);		}	}

這樣做看似完美,然而有一個巨大斃命,每畫一個像素都回繪制到上下文中,每一次都在改變canvas的狀態(tài),這樣做會導(dǎo)致渲染性能太差,因?yàn)橄袼攸c(diǎn)很多,如果畫布比較大,性能很是令人堪憂,并且畫板上面還有一些操作,如此頻繁改變canvas的狀態(tài)是不合適的。

canvas,像素畫板,代碼

因此,正確的做法是:我們應(yīng)該定義好所有的路徑,最好在一次性的批量繪制到canvas中; 

//定義像素的位置for (var i = stepX + .5; i < canvas.width; i+=stepX) {		for (var j = stepY + .5; j < canvas.height; j+=stepY) {			var pixel = new Pixel({				x: i,				y: j,				shape: 'circle'			})			box.push(pixel);		}	}//批量繪制	console.time('time');	ctx.beginPath();	for (var c = 0; c < box.length; c++) {		var circle = box[c];		ctx.moveTo(circle.x + 3, circle.y);		circle.createPath(ctx);	}	ctx.closePath();	ctx.stroke();		console.timeEnd('time');

canvas,像素畫板,代碼

可以看到這個渲染效率很快,盡可能少的改變canvas的狀態(tài),因?yàn)槊扛淖円淮紊舷挛牡臓顟B(tài),canvas都會重新繪制,這種狀態(tài)是全局的狀態(tài)。

像素網(wǎng)格交互

項(xiàng)目的需求是,在畫布上鼠標(biāo)按下移動,可以擦除像素點(diǎn),這里面包含兩個知識點(diǎn),一個是如何獲取鼠標(biāo)移動路徑上的像素網(wǎng)格,二是性能問題,因?yàn)槲覀冞@個需求的要求是繪制八萬個點(diǎn),不說別的,光是循環(huán)都得幾十上百毫秒,何況還要繪制渲染。我們先來看第一個問題:

獲取鼠標(biāo)移動路徑下的網(wǎng)格

看到這個問題,我們很容易想到,寫個函數(shù),通過鼠標(biāo)的位置獲取下所在的位置包含那個網(wǎng)格,然后每次移動都重新更新位置計(jì)算,這樣看是可以完成需求,但是如果鼠標(biāo)移動過快,是無法做到,每個點(diǎn)的位置都可以計(jì)算到的,效果會不連貫。我們換種思路,鼠標(biāo)經(jīng)過的路徑,我們可以很明確的知道起始和終點(diǎn),我們把整個繪制路徑想象成一段段的線段,那么問題就變成,線段與原相交的一個算法了,線段就是畫筆的粗細(xì),線段經(jīng)過的路徑就是鼠標(biāo)運(yùn)動的路徑,與之相交的圓就是需要變化樣式的網(wǎng)格。轉(zhuǎn)換成代碼就是如下:

function sqr(x) { return x * x }    function dist2(p1, p2) { return sqr(p1.x - p2.x) + sqr(p1.y - p2.y) }    function distToSegmentSquared(p, v, w) {        var l2 = dist2(v, w);        if (l2 == 0) return dist2(p, v);        var t = ((p.x - v.x) * (w.x - v.x) + (p.y - v.y) * (w.y - v.y)) / l2;        if (t < 0) return dist2(p, v);        if (t > 1) return dist2(p, w);        return dist2(p, {            x: v.x + t * (w.x - v.x),            y: v.y + t * (w.y - v.y)        });    }	/**	 * @description 計(jì)算線段與圓是否相交	 * @param {x: num, y: num} p 圓心點(diǎn)	 * @param {x: num, y: num} v 線段起始點(diǎn)	 * @param {x: num, y: num} w 線段終點(diǎn)	 */    function distToSegment(p, v, w) {        var offset = pathHeight;        var minX = Math.min(v.x, w.x) - offset;        var maxX = Math.max(v.x, w.x) + offset;        var minY = Math.min(v.y, w.y) - offset;        var maxY = Math.max(v.y, w.y) + offset;        if ((p.x < minX || p.x > maxX) && (p.y < minY || p.y > maxY)) {            return Number.MAX_VALUE;        }        return Math.sqrt(distToSegmentSquared(p, v, w));    }

具體邏輯就不詳述,各位看官可以自行看代碼。然后通過獲取到的相交網(wǎng)格的,然后刪除box里面的數(shù)據(jù),重新render一遍,就可以看到效果了。

canvas,像素畫板,代碼

同樣的道理,我們可以做成染色效果,那么我們就可能實(shí)現(xiàn)一個canvas像素畫板的小demo了。不過做成染色效果就必須使用第一種繪制方法了,每個像素必須是一個對象,因?yàn)槊總€對象的狀態(tài)是獨(dú)立的,不過這個不用擔(dān)心性能,像素點(diǎn)不多,基本不會有卡頓感。實(shí)現(xiàn)效果大體如下:

canvas,像素畫板,代碼

最近又有點(diǎn)懶,先這樣了,后面有時間添加一個上傳圖片,圖片像素畫的功能和導(dǎo)出功能。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到HTML教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
免费人成黄页网站在线一区二区| 国内精品久久久久久久久久久| 欧美啪啪一区| 婷婷激情久久| 高清av免费一区中文字幕| 国产精品主播视频| 制服.丝袜.亚洲.中文.综合懂| 国产做受69高潮| 五月天婷婷色综合| 99riav视频在线观看| 国产精品一区二区日韩| 久久一区二区三| 性欧美1819sex性高清| 国产免费人做人爱午夜视频| 色视频在线观看福利| 91久久精品国产91性色tv| 日韩欧美中文视频| jizz欧美激情18| 高清av电影在线观看| 亚洲欧洲日韩一区二区三区| 五月婷婷六月丁香综合| 日韩免费av一区二区三区| 日韩欧美a级成人黄色| 欧美视频成人| 黄色99视频| 色135综合网| 中文字幕佐山爱一区二区免费| 国产大陆精品国产| 成人xxxxx色| 久久免费电影网| 好吊操这里只有精品| 欧美在线网址| 日韩免费中文专区| 欧美色图第二页| 国产99久久久国产精品| av中文字幕网| 国模冰冰炮一区二区| 欧美一级午夜免费电影| 国产成人在线电影| 国产美女精品人人做人人爽| 久久成人资源| 天天影视色香欲综合| 精品国内自产拍在线观看视频| 久久久成人精品一区二区三区| 精品1区2区在线观看| 国产精品1区2区在线观看| 国产精品羞羞答答在线观看| 日本一级理论片在线大全| 91九色在线播放| 91尤物视频在线观看| 日韩成人午夜精品| 亚洲视频在线一区| 精品成人免费视频| 久久亚洲春色中文字幕| 精品女同一区二区| 亚洲毛片在线免费观看| 91插插插插插插| 亚洲精品一区二区三区网址| 狠狠激情五月综合婷婷俺| 日韩的一区二区| 337p亚洲精品色噜噜| 少妇荡乳情欲办公室456视频| 午夜精品蜜臀一区二区三区免费| 国产成人一区二区三区电影| 久久久久国产精品熟女影院| 黄色成人av在线| 日韩高清欧美高清| 1769国产精品| 麻豆影视在线| 日韩 欧美 精品| 成**人特级毛片www免费| 91国内在线视频| 国产综合色在线观看| 青青草原成人| 日本乱人伦一区| 亚洲欧美激情精品一区二区| 亚洲va久久久噜噜噜久久天堂| 国产av国片精品| 高清在线观看av| 丰满女人性猛交| 久久69精品久久久久久国产越南| 久久久成人精品一区二区三区| 石原莉奈在线亚洲三区| 麻豆91蜜桃| 初体验·韩国| 国产成人欧美日韩在线电影| 在线天堂中文资源最新版| 国产激情久久久| 色www亚洲国产阿娇yao| 18禁裸乳无遮挡啪啪无码免费| 色天天综合网| 特级片在线观看| 宅男深夜视频| 囯产精品久久久久久| 久久久婷婷一区二区三区不卡| 天天综合色天天综合色h| 极品av少妇一区二区| 亚洲成av人影院在线观看| 精品亚洲欧美日韩| 免费a在线观看| 尤物视频在线观看网站| 第一区免费在线观看| 精品久久久久久亚洲综合网| 中文字幕亚洲综合久久筱田步美| 四季久久免费一区二区三区四区| 欧美日韩综合视频| 亚洲精品一区二区三区影院忠贞| 五月天福利视频| 国产精品186在线观看在线播放| 激情久久久久久久| 久久青草免费| 韩日精品一区二区| 男裸体无遮挡网站| 成人精品三级| 日韩免费影院| 日本一道本视频| 国产精品免费看久久久香蕉| 国产无遮挡又黄又爽免费软件| 四季av中文字幕| 免费男女羞羞的视频网站主页在线观看| 精品一区二区三区香蕉蜜桃| 国产又大又黄又粗又爽| 欧美日韩另类图片| 日本一区二区三区在线免费观看| 欧美日韩中文精品| 亚洲三级在线视频| jazzjazz国产精品久久| 一本综合精品| 成年网站免费在线观看| 国产精品亚洲一区二区三区在线| 大陆极品少妇内射aaaaa| 国产亚洲精品一区二区在线观看| 丁香视频免费观看| 欧美成人一区二区| 亚洲综合爱爱久久网| 可以免费看的av毛片| 精品国产午夜福利在线观看| 先锋影音男人| 久久久99久久| 国产成人在线小视频| 色噜噜在线网| 日韩欧美国产黄色| 精品日韩一区二区| 日本wwwcom| 欧美性受xxx黑人xyx性爽| 欧美午夜无遮挡| 男人插入女人视频| 美女无遮挡网站| 激情久久一区| 高清在线观看免费| 伊人久久久久久久久久久久久久| 女人18毛片水真多18精品| 中国极品少妇videossexhd| 国产精品视频在线观看免费| 亚洲a区在线视频| 日韩成人精品在线| 免费高清成人在线| 天天影视综合| 国产美女精品久久久| 亚洲精品国产精品乱码不卡| 中文字幕jux大岛优香| 李宗瑞91在线正在播放| heyzo一本久久综合| 日韩av不卡一区二区| 国产欧美精品久久久| 色与欲影视天天看综合网| 欧美日韩在线视频一区二区| 一个人看的www在线免费视频| 日本一区二区免费不卡| 91亚洲永久免费精品| 九一在线免费观看| 韩国av一区二区三区四区| 日本a级片电影一区二区| 18视频在线观看| 久艹视频在线免费观看| 国产一区二区成人| 国产精品综合不卡av| 亚洲精品国产精品国自产观看浪潮| 不卡一卡2卡3卡4卡精品在| 青青草原成人在线视频| 欧美日韩一区二区三区在线视频| 亚洲精品一级二级三级| 久久69国产一区二区蜜臀| 一级片免费在线观看视频| 一本精品一区二区三区| 欧美性生活大片视频| 日韩精品无码一区二区三区久久久| 99中文字幕一区| 亚洲综合大片69999| 欧美色图第一页| 久久亚洲专区| 天天撸天天射| 国产999在线观看| 欧美久久免费观看| 亚洲青涩在线| 欧美一区二区视频在线| 一区二区三区视频在线| 国产老女人精品毛片久久| 欧美性xxxxx极品娇小| 91好色先生tv| 国产传媒欧美日韩| 亚洲v日本v欧美v久久精品| 97人人爽人人喊人人模波多| 成人av电影免费在线播放| 精品国产99久久久久久宅男i| 丰满少妇高潮久久三区| 日韩中文字幕av| 日本一区二区三区精品| 国产69精品久久app免费版| 国产精品色噜噜| 欧美综合一区| 影音先锋成人在线电影| 亚洲免费av在线| av网站在线免费观看| 日韩精选在线| 日韩系列欧美系列| 国产精品一区二区婷婷| 国产又大又粗又硬| 欧美特黄一级| 337p亚洲精品色噜噜噜| 欧美亚洲愉拍一区二区| 91精品国产高久久久久久五月天| 免费在线观看视频a| 国产精品亚洲综合在线观看| 国产又黄又爽又猛免费app| 美美哒免费高清在线观看视频一区二区| va天堂va亚洲va影视| 玖玖综合伊人| 中文字幕日韩一区二区三区| 先锋成人影院| 午夜精彩国产免费不卡不顿大片| 亚洲性受xxx喷奶水| 一区二区三区国产福利| 亚洲专区国产精品| 色婷婷在线视频观看| 亚洲图片综合网| 国产无遮挡又黄又爽免费软件| 免费在线视频一区二区| 亚洲精品一区视频| 久久国产精品系列| 国产91综合网| 97在线观看免费观看高清| 国产av天堂无码一区二区三区| 蜜臀av一区二区三区| 九九九热精品免费视频观看网站| 免费h在线看| 嫩草影院官网| 亚洲 小说区 图片区 都市| 欧美男男gaygay1069| 午夜国产福利在线| 日本激情一区二区三区| 亚洲av无码片一区二区三区| 美女把尿口扒开让男人桶在线观看| 欧美熟乱15p| 欧美另类videosbest视频| 免费一区二区三区视频狠狠| 一区二区高清视频| 欧美最猛性xxxx| 日韩欧美一级视频| 中文字幕一区二区三区最新| 日本亚洲欧美三级| 久久中文视频| 免费一级欧美片在线观看网站| 欧美国产亚洲另类动漫| 天天干,天天操,天天射| 99re在线视频| 5g影院天天爽成人免费下载| 蜜桃一区二区三区在线| 19j韩国主播韩宝贝在线| 情se视频网在线观看| 亚洲乱码中文字幕综合| 色婷婷综合视频| 日韩av不卡在线| 99香蕉国产精品偷在线观看| 91伊人久久大香线蕉| 污视频在线免费观看一区二区三区| 久久久久久久久久国产精品| 国产一区二区三区综合| 极品尤物av久久免费看| 91麻豆swag| 高清电影一区| 欧美成人欧美edvon| 9i在线看片成人免费| 国产亚洲婷婷免费| 久久综合中文字幕| 1024av视频| 福利视频午夜| 精品久久国产老人久久综合| 亚洲黄色a v| 亚洲一区二区三区激情| 色婷婷综合久久久中字幕精品久久| 天堂av中文字幕| 国产浮力第一页| 91在线观看地址| 在线中文字幕不卡| 日韩一级特黄毛片| 69av自拍偷拍| 国产精选一区二区三区不卡催乳| 国产一区二区三区视频在线| 日韩三级电影网| 五月婷婷欧美视频| 久久久久久欧美精品se一二三四| 你懂得网站在线| 精品国产乱码久久久久久虫虫漫画| 亚洲国产精品电影在线观看| 俄罗斯av网站| 久久久久久亚洲精品杨幂换脸| 久久精品久久99精品久久| 国产精品欧美精品| 欧美精品亚洲精品日韩精品| 45www国产精品网站| 成人av电影免费| 婷婷综合久久中文字幕蜜桃三电影| 亚洲国产精品va在线观看黑人| 午夜精品久久久久99热蜜桃导演| 亚洲aa在线| 欧美黑人巨大xxxxx| sedog在线观看| 在线色视频观看| 国产精品美女高潮无套| 精品97人妻无码中文永久在线| 韩国在线一区| 精品亚洲国产成人av制服丝袜| 第四色在线视频| 99国产精品久久久久久久久久| 亚洲自拍电影| 欧美黄免费看| 久久成人18免费网站|