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

JS圖形編輯器場景坐標視口坐標的相互轉換

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

圖形編輯器坐標系

圖形編輯器的坐標系有兩種。

一個是場景(scene)坐標系,一個是 視口(viewport)坐標系。視口就是場景的一個子區(qū)域。

假設我們的視口的原點,離場景原點的坐標水平和垂直距離分別為 scrollX 和 scrollY。

先 不考慮縮放,假設我們在視口坐標上的某個地方點擊了一下,這個坐標是 (x, y)。這個坐標在場景坐標系中,就是:

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

挺簡單。

視口坐標轉換為場景坐標

下面我們引入畫布縮放,即畫布可以縮小和放大,對應的一個比例值 zoom。

視口中的某個坐標 (x, y) 在場景坐標系,則是 :

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

之所以要用 x 除以 zoom,是因為此時視口中展示的是縮放后的圖形,里面的坐標都是縮放后的值。所以需要先轉換為 zoom 值為 1 對應的真實值。

場景坐標轉換為視口坐標

然后我們反過來,如何從場景坐標 (x, y) 轉換為視口坐標?將前面的公式做等式變換即可:

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

我們通常是使用按鍵加滾輪的方式讓畫布以光標為中心進行縮放,或按按鈕進行縮放,

為了讓縮放后的場景還能對上縮放前光標的位置,我們需要計算縮放后的 scrollX 和 scrollY,進行校準。

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

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

再說點別的。

可能會有這么一種情況,就是實際的視口區(qū)域的原點坐標有一些偏移,偏移了 offsetX 和 offsetY,見下圖。

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

就這些了。

總結一下,視口坐標是場景坐標平移并縮放后的結果,所以視口轉場景,需要除以 zoom 再加上偏移值。在圖形編輯器中,會有相當多的坐標系轉換邏輯,這兩個坐標系的關系需要好好消化理解,更多關于JS場景視口坐標轉換的資料請關注腳本之家其它相關文章!

相關文章

  • JavaScript?API?ResizeObserver使用示例

    JavaScript?API?ResizeObserver使用示例

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

    微信小程序 判斷手機號的實現代碼

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

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

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

    JavaScript 條件判斷使用技巧詳解

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

    javascript的setTimeout()使用方法總結

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

    詳解 TypeScript 枚舉類型

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

    JavaScript嚴格模式不支持八進制的問題講解

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

    微信小程序日歷組件calendar詳解及實例

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

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

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

    ajax與302響應代碼測試

    服務器端的響應是302 Found,在ajax的回調函數中能夠獲取這個狀態(tài)碼嗎?能夠從Response Headers中得到Location的值進行重定向嗎?讓我們來一起動手寫寫代碼看看實際情況吧。
    2013-10-10

最新評論

比如县| 阿克苏市| 苍南县| 增城市| 台南市| 枣强县| 周宁县| 文安县| 苍梧县| 尼玛县| 奉节县| 绥阳县| 成武县| 郸城县| 清新县| 宾阳县| 叙永县| 北票市| 黎平县| 龙陵县| 辽源市| 达州市| 文安县| 定陶县| 清原| 申扎县| 常熟市| 新邵县| 恭城| 宜都市| 昆山市| 金门县| 乐平市| 南阳市| 万宁市| 庆阳市| 库尔勒市| 东港市| 政和县| 巫山县| 佳木斯市|