最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS圖形編輯器場(chǎng)景坐標(biāo)視口坐標(biāo)的相互轉(zhuǎn)換

 更新時(shí)間:2023年01月16日 10:09:51   作者:西瓜  
這篇文章主要為大家介紹了JS圖形編輯器之場(chǎng)景坐標(biāo)視口坐標(biāo)的相互轉(zhuǎn)換示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

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

圖形編輯器的坐標(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)

下面我們引入畫(huà)布縮放,即畫(huà)布可以縮小和放大,對(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
??};
}

我們通常是使用按鍵加滾輪的方式讓畫(huà)布以光標(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);
??//?縮放后畫(huà)布縮放比變成了?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)系需要好好消化理解,更多關(guān)于JS場(chǎng)景視口坐標(biāo)轉(zhuǎn)換的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • JavaScript?API?ResizeObserver使用示例

    JavaScript?API?ResizeObserver使用示例

    這篇文章主要為大家介紹了JavaScript?API?ResizeObserver的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 微信小程序 判斷手機(jī)號(hào)的實(shí)現(xiàn)代碼

    微信小程序 判斷手機(jī)號(hào)的實(shí)現(xiàn)代碼

    這篇文章主要介紹了微信小程序 判斷手機(jī)號(hào)的實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 手把手教你從0搭建前端腳手架詳解

    手把手教你從0搭建前端腳手架詳解

    這篇文章主要介紹了手把手教你從0搭建前端腳手架詳解,腳手架就是在啟動(dòng)的時(shí)候詢問(wèn)一些簡(jiǎn)單的問(wèn)題,并且通過(guò)用戶回答的結(jié)果去渲染對(duì)應(yīng)的模板文件,需要的朋友可以參考下
    2023-03-03
  • JavaScript 條件判斷使用技巧詳解

    JavaScript 條件判斷使用技巧詳解

    這篇文章主要為大家介紹了JavaScript 條件判斷使用技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • javascript的setTimeout()使用方法總結(jié)

    javascript的setTimeout()使用方法總結(jié)

    這篇文章主要給大家分享javascript的setTimeout()使用方法總結(jié),js的setTimeout方法用處比較多,通常用在頁(yè)面刷新了、延遲執(zhí)行了等等,下面我們一起來(lái)看看文章對(duì)該內(nèi)容的具體總結(jié)吧,需要的朋友可以參考一下
    2021-11-11
  • 詳解 TypeScript 枚舉類型

    詳解 TypeScript 枚舉類型

    這篇文章主要介紹了TypeScript 枚舉類型,TypeScript 在 ES 原有類型基礎(chǔ)上加入枚舉類型,使得在 TypeScript 中也可以給一組數(shù)值賦予名字,這樣對(duì)開(kāi)發(fā)者比較友好,可以理解枚舉就是一個(gè)字典,文章內(nèi)容圍繞TypeScript 枚舉類型展開(kāi)內(nèi)容,需要的朋友可以參考一下
    2021-10-10
  • JavaScript嚴(yán)格模式不支持八進(jìn)制的問(wèn)題講解

    JavaScript嚴(yán)格模式不支持八進(jìn)制的問(wèn)題講解

    這篇文章主要講解JavaScript嚴(yán)格模式不支持八進(jìn)制的問(wèn)題,本文圍繞JavaScript嚴(yán)格模式展開(kāi)內(nèi)容,詳細(xì)介紹為什么JavaScript嚴(yán)格模式不支持八進(jìn)制,下面來(lái)看看詳細(xì)介紹,需要的朋友可以參考一下
    2021-11-11
  • 微信小程序日歷組件calendar詳解及實(shí)例

    微信小程序日歷組件calendar詳解及實(shí)例

    這篇文章主要介紹了微信小程序日歷組件calendar詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • 微信小程序 action-sheet底部菜單詳解

    微信小程序 action-sheet底部菜單詳解

    這篇文章主要介紹了微信小程序 action-sheet底部菜單詳解的相關(guān)資料,并附實(shí)例代碼,需要的朋友可以參考下
    2016-10-10
  • ajax與302響應(yīng)代碼測(cè)試

    ajax與302響應(yīng)代碼測(cè)試

    服務(wù)器端的響應(yīng)是302 Found,在ajax的回調(diào)函數(shù)中能夠獲取這個(gè)狀態(tài)碼嗎?能夠從Response Headers中得到Location的值進(jìn)行重定向嗎?讓我們來(lái)一起動(dòng)手寫(xiě)寫(xiě)代碼看看實(shí)際情況吧。
    2013-10-10

最新評(píng)論

镇康县| 武威市| 抚远县| 丹凤县| 祁连县| 依安县| 隆昌县| 朝阳县| 宿迁市| 师宗县| 南城县| 秦皇岛市| 浦县| 许昌县| 禹城市| 佳木斯市| 桃源县| 屏东市| 九龙县| 临朐县| 江城| 军事| 云霄县| 嫩江县| 余庆县| 静宁县| 长宁区| 汝州市| 丰宁| 彭水| 分宜县| 武山县| 景东| 泽州县| 桑植县| 阳山县| 行唐县| 上饶市| 达日县| 济阳县| 安仁县|