<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
圖形編輯器的座標系有兩種。
一個是場景(scene)座標系,一個是 視口(viewport)座標系。視口就是場景的一個子區域。
假設我們的視口的原點,離場景原點的座標水平和垂直距離分別為 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 }; }
再說點別的。
可能會有這麼一種情況,就是實際的視口區域的原點座標有一些偏移,偏移了 offsetX 和 offsetY,見下圖。
我們只需要將前面程式碼中的 scrollX 變成 (scrollX + offsetX),scrollY 變成 (scrollY + offsetY),其他不變。
就這些了。
總結一下,視口座標是場景座標平移並縮放後的結果,所以視口轉場景,需要除以 zoom 再加上偏移值。在圖形編輯器中,會有相當多的座標系轉換邏輯,這兩個座標系的關係需要好好消化理解,更多關於JS場景視口座標轉換的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45