20230729

Canvas 要搞清楚畫圖原點位置

就是這個,卡了快一個禮拜。主要要做到的事,是把上方用 CSS 調整過後的、眼睛看到的樣子,畫在下方 Canvas 裡,角度、旋轉、位移都要一樣。

function draw() {
  const c = document.getElementById("myCanvas");
  const ctx = c.getContext("2d");
  const img = document.getElementById("scream");
  document.getElementById("msg").innerHTML=img.offsetLeft;
  const scaleratio=1.5;
  const diffx=400 + img.width / 2;
  const diffy=0 + img.height / 2;
  
  ctx.translate(diffx,diffy);
  ctx.scale(scaleratio,scaleratio);
  ctx.rotate(Math.PI/180*45);
  ctx.drawImage(img,-img.width/2, -img.height/2, img.width, img.height);
}

首先算出 diffx and diffy, 這是為了要後來要將 Canvas 畫圖原點預設是在左上角,接下來要移到 img 的中心原點用的。畢竟上方 user 看到的畫面,都是以 img 中心來操作的(CSS transform) ,要說是拿左上角操作的話,大概只有 translate 可以說是拿左上角的點進行操作。

img 的中心 x 座標是 img.width / 2,要記得加上模擬的位移 400,同樣 img 的中心 y 座標是 img.height / 2,也要加上模擬位移 = 0。canvas scale 數值和 css scale 數值一樣,剩 canvas rotate 用的是弧度而不是角度,要記得換算。

真正重要的地方是在 ctx.translate(diffx, diffy) 這一步,把 canvas 原點移到跟 img 一樣是在中心的地方。本來以為先放大再位移會是一樣的結果,可是實驗結果就是不對,最後把數字印出來才發現,放大後不會更改座標數字,例如原本是 (1, 1) 在放大後取得的座標值也還是 (1, 1) ,但是會跑到看起來是 (1.5, 1.5) 的地方,因為 canvas scale 改了座標的單位,假設本來一個刻度是 1cm 的放大後一個刻度是 1.5cm 這樣,「先放大再旋轉」或「先旋轉再放大」好像就沒有差別了。

最後真正 drawImage 的時候,因為已經把中心移到跟 img 中心一樣在中間的位置了,所以要畫出左上角的話, dx = -img.width / 2, dy = -img.height / 2 才對,配上畫完整個 img 的寬度、高度。

23.08.09 update. 趁今天有空,寫在 codepen裡,免得下次我要畫圖的時候又忘記了。

20230223

Object : hasOwn

就是這個,花了兩小時在找問題...

if (Object.hasOwn(myObj, 'error') { blah blah blah}

我一直用這樣寫法好一陣子了,結果今天丟到 ipad 上就失敗。因為還有 async, await 在,沒有第一時間覺得是 hasOwn 的事,直到查了 Can I use?

還好,解決問題

20221215

12/15

我載著 Y 回家,他家在某個往上大斜坡的頂點那棟大樓。路上不知道講了什麼話題,他說隔天帶我去參與討論,看看現在的實力。Y 的家在往上大斜坡的話,我住的地方就是向下大斜坡的中間處了吧。

隔天我真的跟著去了,是個可以坐 12 人的大會議桌,我只記得桌上擺滿點心,是 workshop 還是 seminar 實在不確定。Y 在我左邊,他是 leader. 首先是我正對面的女生說話,介紹了他最近學到的新東西。接著是我右前的男生說話 (上一位的左手邊) ,同樣也講了一些新技術。他們都用道地的英文介紹著,口語表達能力很好,邏輯也好。在此同時我很尷尬,桌上的點心被拿走的很快,我拿了其中一盤的最後一塊,打算清理盤子了。結果那一塊蛋糕還掉了一半下來,馬上被我左手邊那位小姐拿走,同時他一臉瞪著我(畢竟我搶了他的位置)。輪過一輪後,Y 叫我也說點什麼,不過我真的沒東西好說,就跟大家打個招呼,準備離開了。

此時我右前的那位男生就說了:「沒東西分享就不要來這裡丟臉。」這時候我開始流淚(現實中也流淚,是半夢半醒狀態了),想到自己真的沒什麼競爭力,我也就跟大家直說「因為沒有一直精進學習,特別確診後心懶懶,根本也沒從前認真工作了,心裡已經很擔心,特別聽到大家分享的技術,覺得自己遲早會被淘汰。」結果我正前的女生卻說我:「但是你有很好的安排能力。」原來桌上的點心是我找出來、變出來的。

後來也不知道什麼契機,我決定去旅行增加見識。結果下一段夢就是在波蘭某個火車站,我在車上遇到某個女生,他一直提醒我要小心扒手,下車後我決定跟著他,走出車站。