国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

圖形編輯器:圖形和輔助線繪制的坐標(biāo)問題

開發(fā) 前端
有一樣非常低效的做法,就是生成一個(gè)非常大的 Canvas 畫布,將其中的圖形全部都畫出來,然后用一個(gè) div 容器裝下,然后給 div 設(shè)置 overflow: scroll。然后調(diào)整一下 div 的 scrollLeft 和 scrollTop 就好。不推薦,效率很差。

大家好,我是前端西瓜哥。今天看看繪制圖形和輔助線時(shí),坐標(biāo)轉(zhuǎn)換的一些注意點(diǎn)。

項(xiàng)目地址,歡迎 star:

??https://github.com/F-star/suika??

線上體驗(yàn):

??https://blog.fstars.wang/app/suika/??

圖片

視口轉(zhuǎn)場(chǎng)景:

function viewportCoordsToSceneCoords(x, y, scrollX, scrollY, zoom) {
return {
x: scrollX + x / zoom,
y: scrollY + y / zoom
}
}

場(chǎng)景轉(zhuǎn)視口:

function sceneCoordsToViewportCoords(x, y, scrollX, scrollY, zoom) {
return {
x: (x - scrollX) * zoom,
y: (y - scrollY) * zoom
};
}

圖形的繪制

場(chǎng)景很大,但能畫的范圍其實(shí)就視口大小。所以,我們需要將使用了場(chǎng)景坐標(biāo)的圖形的位置,轉(zhuǎn)換為視口坐標(biāo),再繪制。

有一樣非常低效的做法,就是生成一個(gè)非常大的 Canvas 畫布,將其中的圖形全部都畫出來,然后用一個(gè) div 容器裝下,然后給 div 設(shè)置 overflow: scroll。然后調(diào)整一下 div 的 scrollLeft 和 scrollTop 就好。不推薦,效率很差。

對(duì)于圖形我們的做法是在繪制圖形前,先做矩陣變換,讓之后繪制的所有像素都自動(dòng)做一個(gè)轉(zhuǎn)換,不用自己一個(gè)個(gè)手動(dòng)轉(zhuǎn)換。

有的朋友看著前面的 sceneCoordsToViewportCoords 方法,有:

viewportX = (sceneX - scrollX) * zoom;

于是認(rèn)為 ctx 的變換對(duì)應(yīng)的寫法是這樣的:

ctx.translate(-viewport.x, -viewport.y);
ctx.scale(zoom, zoom);

// 繪制各種圖形
// ...

這個(gè)寫法思路是對(duì)的,但細(xì)節(jié)有錯(cuò)誤。因?yàn)?nbsp;ctx.scale 的縮放中心因?yàn)榍懊娴腸tx.tranlate 從 (0, 0) 變成了 (-viewport.x, -viewport.y) 。

正確的寫法其實(shí)是縮放時(shí)調(diào)整一下縮放中心,縮放后再移回去,即:

ctx.translate(-viewport.x, -viewport.y);
ctx.translate(viewport.x, viewport.y);
ctx.scale(zoom, zoom);
ctx.translate(-viewport.x, -viewport.y);

然后你會(huì)發(fā)現(xiàn),第一行和第二行抵消了,于是化簡(jiǎn)得到:

ctx.scale(zoom, zoom);
ctx.translate(-viewport.x, -viewport.y);

// 繪制各種圖形
// ...

輔助線的繪制

上面的效果,是無差別給之后繪制的所有圖形做縮放。也就是說,zoom 變大時(shí),線寬(ctx.lineWidth)也會(huì)跟著變大。

圖形編輯器要繪制的除了圖形外,還有非常重要的一樣?xùn)|西:輔助線。

(輔助線的坐標(biāo)我們也是用場(chǎng)景坐標(biāo)系的)

對(duì)于輔助線,我們希望 zoom 改變時(shí),還能讓線寬保持原來的 1px,還有讓控制點(diǎn)的尺寸不變,如下圖效果:

圖片

縮放功能演示

解決方案是,我們自己算輔助線上的點(diǎn)在視口坐標(biāo)的位置,不借助 ctx.scale 和 ctx.translate。

// 變換矩陣重置
ctx.setTransform(1, 0, 0, 1, 0, 0);
// 計(jì)算視口坐標(biāo)系下的坐標(biāo)值
const {x, y} = sceneCoordsToViewportCoords(rotationX, rotationY, viewport.x, viewport.y, zoom)

首先用 ctx.setTransform 將變換矩陣重置,將之前 ctx.scale 等造成的影響消除掉。

然后就是用前面寫好的 sceneCoordsToViewportCoords 方法轉(zhuǎn)換一下,得到視口坐標(biāo)系下的位置,然后進(jìn)行繪制即可。

其實(shí)就是局部做坐標(biāo)系轉(zhuǎn)換,比如坐標(biāo)會(huì)轉(zhuǎn)換、線寬不轉(zhuǎn)換。其實(shí)也有另一種思路,就是讓線寬除以 zoom,或尺寸除以 zoom,都可以。

結(jié)尾

場(chǎng)景坐標(biāo)和視口坐標(biāo)轉(zhuǎn)換,貫穿于整個(gè)編輯器項(xiàng)目,還是很重要的,要好好消化。

責(zé)任編輯:姜華 來源: 前端西瓜哥
相關(guān)推薦

2023-09-07 08:24:35

圖形編輯器開發(fā)繪制圖形工具

2023-10-19 10:12:34

圖形編輯器開發(fā)縮放圖形

2023-07-31 08:46:07

圖形編輯器圖形自動(dòng)對(duì)齊

2023-02-06 16:59:57

Canvas編輯器

2023-09-26 07:39:21

2023-01-17 09:16:57

視口坐標(biāo)圖形編輯器

2023-08-31 11:32:57

圖形編輯器contain

2023-04-07 08:02:30

圖形編輯器對(duì)齊功能

2023-01-18 08:30:40

圖形編輯器元素

2023-02-01 09:21:59

圖形編輯器標(biāo)尺

2023-02-09 07:02:30

圖形編輯器修改圖形

2023-04-10 08:45:44

圖形編輯器排列移動(dòng)功能

2024-01-03 08:43:17

圖形編輯器旋轉(zhuǎn)控制點(diǎn)縮放控制點(diǎn)

2023-10-08 08:11:40

圖形編輯器快捷鍵操作

2024-01-08 08:30:05

光標(biāo)圖形編輯器開發(fā)游標(biāo)

2023-09-11 09:02:31

圖形編輯器模塊間的通信

2023-05-09 08:15:32

圖形編輯器撤銷重做功能

2023-10-10 16:04:30

圖形編輯器格式轉(zhuǎn)換

2023-03-03 10:24:51

2023-08-28 08:10:50

Hex圖形編輯器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

成人自拍视频网| 国产剧情一区二区三区| 日韩精品黄色网| 黄色网免费看| 久久色成人在线| 亚洲精品二区| 国产亚洲高清视频| 亚洲最大成人免费视频| 秋霞影视一区二区三区| 自拍偷拍免费精品| 91白丝在线| 欧美一区二区大片| h视频网站在线观看| 欧美性xxxxx| 中文在线www| 午夜视频一区在线观看| 午夜视频国产| 中文字幕一区av| 日韩精品一区二区三区不卡 | 欧美日韩一区二区三区在线电影| 亚洲视频综合网| 在线精品亚洲欧美日韩国产| 日韩精品电影网| 另类激情视频| 中文字幕日韩在线视频| 99久久这里有精品| 欧美肥婆姓交大片| 神马日本精品| 国产精品久久久久99| 小处雏高清一区二区三区| 成人精品视频在线| 亚洲经典在线| 日本不卡在线播放| 久久精品72免费观看| 女女同性女同一区二区三区按摩| 国产在线不卡视频| 日韩精品 欧美| 日本一区二区不卡视频| 18av.com视频| 欧美性20hd另类| 黄色免费网站在线观看| 亚洲精品久久7777777| 激情亚洲影院在线观看| 久久久成人的性感天堂| 日韩三区视频| 成人看片在线| 蜜臀a∨国产成人精品| 少妇人妻无码专区视频| 欧美激情一区不卡| 中文字幕视频在线免费| 欧美日韩国产美| 香蕉伊大人中文在线观看| 久久午夜a级毛片| 欧美一区二区性| 欧美主播一区二区三区美女 久久精品人 | 伊人狠狠色丁香综合尤物| 成人av免费在线观看| 午夜激情福利在线| 欧美性猛交99久久久久99按摩| 国产二区三区在线| 国产一区二区三区日韩欧美| 日韩av三区| 国产欧美日韩一区| 国产久卡久卡久卡久卡视频精品| 激情内射人妻1区2区3区 | 北条麻妃av高潮尖叫在线观看| 亚洲电影一区二区三区| 丁香花高清在线观看完整版| 欧美精品性视频| 欧美日韩国产精品一区二区亚洲| 免费的av在线| 亚洲影视资源网| 国产偷倩在线播放| 91精品国产亚洲| 日韩有码一区二区三区| 嫩草影院国产精品| 在线成人av影院| 久久狠狠久久| 一区精品视频| 日韩欧美aaa| 国产一区二区三区黄网站| 国产欧美综合精品一区二区| 亚洲国产精品成人久久综合一区| 国产cdts系列另类在线观看| 2019中文字幕全在线观看| 奇米色一区二区| 最新国产在线| 欧美成人激情视频免费观看| 亚洲欧美成人| 超碰色偷偷男人的天堂| 日韩黄在线观看| 午夜精品久久久久久久四虎美女版| 日本xxxxxxxxxx75| 欧美成人精精品一区二区频| 99热精品久久| 亚洲综合日韩欧美| 一区国产精品视频| 亚洲精品一级| 中文产幕区在线观看 | 国产三级精品三级在线专区| 污视频网站在线免费| 国产精品美女主播| 久久精品亚洲国产奇米99| a毛片不卡免费看片| 99九九视频| 亚洲少妇最新在线视频| 成人黄页网站视频| 亚洲开发第一视频在线播放| 91福利精品视频| 精品国产精品国产偷麻豆| 久久精品国产精品亚洲色婷婷| 欧美一级日韩一级| 在线观看亚洲| 猫咪在线永久网站| 91精品视频在线看| 亚洲第一主播视频| 欧美一区二区三| 免费网站www在线观看| 91禁外国网站| 国产精品久久久久久一区二区三区 | 国产成人免费xxxxxxxx| 国产激情视频在线| 国产成人免费观看| 岛国av一区二区三区| 精品freesex老太交| 成年美女网站| 日本sm极度另类视频| 国产精品国产三级国产普通话三级 | 成人精品中文字幕| 国产精品久久久久久久乖乖| 亲爱的老师9免费观看全集电视剧| 欧美日韩三级在线| 国产专区欧美精品| 免费高清视频精品| 欧美国产极品| 国产精品秘入口| 国产三区在线视频| 4k岛国日韩精品**专区| 成人激情春色网| 亚洲欧美日韩爽爽影院| 欧美日韩一区三区| 欧美精品日韩精品| 一区二区在线观看不卡| 国产亚洲精品v| 日本不卡一二三区黄网| 日本一区中文字幕| 国产精品久久久久久一区二区三区 | 日韩一级二级三级精品视频| 中文字幕日韩一区| 一区二区成人在线视频| 99国产精品国产精品毛片| 国产伦精品一区二区三区千人斩 | 日韩人体视频一二区| 欧美激情综合在线| 中文字幕欧美激情| 欧美一激情一区二区三区| 欧美日免费三级在线| 色综合色综合色综合色综合色综合| 精品伊人久久久久7777人| 国产精品国产三级在线观看| 欧美777四色影视在线| 亚洲成人av免费看| 99久久99久久| 久久成人在线视频| 精品国产一区二区三区久久久| 亚洲人成精品久久久久久| 欧美mv日韩mv| 国产视频自拍一区| 亚洲国产天堂久久综合网| 成人97在线观看视频| 国产日韩在线播放| 精品日本一区二区三区| 天天干天天色天天爽| 免费在线观看黄色网| 日韩欧美美女在线观看| 亚洲免费毛片| 亚洲精品v亚洲精品v日韩精品| 3d动漫一区二区三区在线观看| 国产精品一区三区在线观看| 2020国产精品极品色在线观看| 亚洲国产精品久久久天堂| 欧美日韩麻豆| 国产成年精品| 久久精品国产大片免费观看| 亚洲黄色av一区| 国产视频久久久久久久| 欧美亚洲激情在线| 国产一区二区免费电影| 内射国产内射夫妻免费频道| 瑟瑟视频在线| 麻豆系列在线观看| 欧洲激情综合| 中文字幕精品一区 | 超碰国产在线| 一区二区三区在线视频看| 国产亚洲人成网站在线观看| 欧美国产日韩a欧美在线观看 | 亚洲精品日韩成人| 韩国三级电影久久久久久| 欧美午夜电影在线|