成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

圖形編輯器:場(chǎng)景坐標(biāo)、視口坐標(biāo)以及它們之間的轉(zhuǎn)換

開(kāi)發(fā) 前端
視口坐標(biāo)是場(chǎng)景坐標(biāo)平移并縮放后的結(jié)果,所以視口轉(zhuǎn)場(chǎng)景,需要除以 Zoom 再加上偏移值。在圖形編輯器中,會(huì)有相當(dāng)多的坐標(biāo)系轉(zhuǎn)換邏輯,這兩個(gè)坐標(biāo)系的關(guān)系需要好好消化理解。

大家好,我是前端西瓜哥。

圖形編輯器的坐標(biāo)系有兩種。

一個(gè)是場(chǎng)景(scene)坐標(biāo)系,一個(gè)是 視口(viewport)坐標(biāo)系。視口就是場(chǎng)景的一個(gè)子區(qū)域。

圖片

假設(shè)我們的視口的原點(diǎn),離場(chǎng)景原點(diǎn)的坐標(biāo)水平和垂直距離分別為 scrollX 和 scrollY。

先 不考慮縮放,假設(shè)我們?cè)谝暱谧鴺?biāo)上的某個(gè)地方點(diǎn)擊了一下,這個(gè)坐標(biāo)是 ??(x, y)??。這個(gè)坐標(biāo)在場(chǎng)景坐標(biāo)系中,就是:

const sceneX = scrollX + x;
const sceneY = scrollY + y;

挺簡(jiǎn)單。

視口坐標(biāo)轉(zhuǎn)換為場(chǎng)景坐標(biāo)

下面我們引入畫布縮放,即畫布可以縮小和放大,對(duì)應(yīng)的一個(gè)比例值 zoom。

視口中的某個(gè)坐標(biāo) (x, y) 在場(chǎng)景坐標(biāo)系,則是 :

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

之所以要用 x 除以 zoom,是因?yàn)榇藭r(shí)視口中展示的是縮放后的圖形,里面的坐標(biāo)都是縮放后的值。所以需要先轉(zhuǎn)換為 zoom 值為 1 對(duì)應(yīng)的真實(shí)值。

場(chǎng)景坐標(biāo)轉(zhuǎn)換為視口坐標(biāo)

然后我們反過(guò)來(lái),如何從場(chǎng)景坐標(biāo) (x, y) 轉(zhuǎn)換為視口坐標(biāo)?將前面的公式做等式變換即可:

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

我們通常是使用按鍵加滾輪的方式讓畫布以光標(biāo)為中心進(jìn)行縮放,或按按鈕進(jìn)行縮放,

為了讓縮放后的場(chǎng)景還能對(duì)上縮放前光標(biāo)的位置,我們需要計(jì)算縮放后的 scrollX 和 scrollY,進(jìn)行校準(zhǔn)。

核心思路是 保持縮放前點(diǎn)到視口左上角距離(視口坐標(biāo)系)相同。

function calScrollVal(cx, cy, prevZoom, zoom, scrollX, scrollY) {
// 先計(jì)算目標(biāo)點(diǎn)的場(chǎng)景坐標(biāo)(這里 cx 和 cy 是基于視口坐標(biāo)系的)
const { x: sceneX, y: sceneY } = viewportCoordsToSceneCoords(cx, cy, prevZoom, scrollX, scrollY);
// 縮放后畫布縮放比變成了 zoom,距離視口左上角的距離變成了 cx / zoom
// 減去這個(gè)距離,就是新的 scrollX 了。
const newScrollX = sceneX - cx / zoom;
const newScrollY = sceneY - cy / zoom;

return {
x: newScrollX,
y: newScrollY
};
}

再說(shuō)點(diǎn)別的。

可能會(huì)有這么一種情況,就是實(shí)際的視口區(qū)域的原點(diǎn)坐標(biāo)有一些偏移,偏移了 offsetX 和 offsetY,見(jiàn)下圖。

圖片

我們只需要將前面代碼中的 scrollX 變成 (scrollX + offsetX),scrollY 變成 (scrollY + offsetY),其他不變。

就這些了。

總結(jié)一下,視口坐標(biāo)是場(chǎng)景坐標(biāo)平移并縮放后的結(jié)果,所以視口轉(zhuǎn)場(chǎng)景,需要除以 zoom 再加上偏移值。在圖形編輯器中,會(huì)有相當(dāng)多的坐標(biāo)系轉(zhuǎn)換邏輯,這兩個(gè)坐標(biāo)系的關(guān)系需要好好消化理解。

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

2023-02-02 14:07:00

圖形編輯器Canvas

2023-10-10 16:04:30

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

2023-10-19 10:12:34

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

2023-01-18 08:30:40

圖形編輯器元素

2023-02-01 09:21:59

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

2023-04-07 08:02:30

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

2023-09-26 07:39:21

2023-04-10 08:45:44

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

2023-08-31 11:32:57

圖形編輯器contain

2023-09-07 08:24:35

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

2023-02-06 16:59:57

Canvas編輯器

2023-10-08 08:11:40

圖形編輯器快捷鍵操作

2023-09-11 09:02:31

圖形編輯器模塊間的通信

2023-05-09 08:15:32

圖形編輯器撤銷重做功能

2024-01-08 08:30:05

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

2023-02-09 07:02:30

圖形編輯器修改圖形

2023-08-28 08:10:50

Hex圖形編輯器

2023-03-03 10:24:51

2023-06-12 08:22:56

圖形編輯器工具

2024-11-27 09:02:01

文本編輯canvas圖形編輯器
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 久久精品一区 | 国产精品国产a级 | 日韩一区二区三区在线播放 | 国产一区三区在线 | 草比av| av片在线观看网站 | 成人精品一区二区三区中文字幕 | 欧美激情精品久久久久久变态 | 精品久久香蕉国产线看观看亚洲 | 亚洲福利视频一区二区 | 亚洲小视频在线播放 | 欧美不卡视频一区发布 | 亚洲在线免费观看 | 国产免费高清 | 中文字幕在线观 | 亚洲欧美视频一区二区 | 亚洲欧美国产毛片在线 | 在线不卡视频 | 罗宾被扒开腿做同人网站 | 精品国产乱码久久久久久果冻传媒 | 中文一区二区 | 欧美成人a| 国产高清一区二区三区 | 亚洲人成一区二区三区性色 | 日本三级在线 | 精品无码久久久久久国产 | 国产高清在线观看 | 欧美a在线| 欧美美女爱爱视频 | 在线观看亚洲精品 | 日本精a在线观看 | 黄色片视频网站 | 日韩一区二区三区在线观看视频 | 久久精品网 | 国产精品一区二区久久久久 | 欧美一级免费看 | 视频二区国产 | 国产亚洲精品精品国产亚洲综合 | 九色国产 | 九九热免费在线观看 | 黑人巨大精品欧美一区二区免费 |