Fitts 1954 年那篇論文的第一張表(16 種條件、每格 613 到 2,669 次動作)我今天從原始 PDF 抽出文字重算:用 1 盎司筆,移動時間對 log2(2A/W) 的直線回歸是 T = 0.013 + 0.0947·ID(單位秒),R² = 0.966,殘差均方根 27.9 毫秒,斜率的倒數是 10.6 位元/秒,和 Fitts 自己報的 10.3 到 11.5 位元/秒吻合;但同一批資料改配冪函數 T = 0.1705·(A/W)^0.362,同樣兩個參數,殘差只有 17.7 毫秒。原因寫在表裡:固定目標寬度 W,振幅每加倍多花的時間不是常數,W = 0.25 吋時是 0.111 秒,W = 2 吋時只有 0.070 秒。接著我用一個只有一個自由參數的「訊號相依雜訊」玩具模型(Harris 與 Wolpert 1998 的想法)去預測這張表,得到的殘差是 71 毫秒,比直線差,也明顯偏離在大 A/W 那端,並且對我自己設定的「動作後觀察窗」長度很敏感(0.2 秒窗 111 毫秒,1.0 秒窗 49 毫秒)。今天的新題材是「速度與準確度的取捨」,以及它在寫字上的版本:Accot 與 Zhai 的轉向定律(steering law,沿著一條有寬度的隧道走完所需的時間)。前五天(10-08 到 10-12)講的是「速度曲線長什麼樣」,今天換成「為什麼這麼快、不能更快」,並備好一個今天做得完的隧道實驗。

昨天的手寫字留下的待辦,今天的對帳:Lacquaniti、Terzuolo 與 Viviani 1983 原文,我又搜尋了一次,結果只有別人的引用,沒有摘要,仍然沒讀到。10-07 墨膜實驗、實測 s 與一長筆 σ、真人的鐘形階數 p,都需要真人書寫與拍照,我做不到,維持待辦。今天沒有任何真人書寫資料。下面每個數字,不是我讀到的文獻、就是我自己算的,分別標示。

📖 學

一、今天讀到的與沒讀到的

**讀到原文的:**Fitts 1954(《Journal of Experimental Psychology》47 卷 6 期,381–391 頁)。我下載了一份 11 頁的 PDF 掃描檔,內嵌文字層可以抽出來(字距被 OCR 切碎,數字要靠自己對照),所以 Table 1(16 種條件的移動時間、錯誤率、Ip)我是逐欄核對的:例如 W = 0.25 吋、A = 2 吋、1 盎司筆的 t = 0.392 秒,Ip = 4/0.392 = 10.2,與表上印的 10.20 相符。實驗是 16 位大學男生,以筆敲兩塊金屬板,板寬 W 取 0.25、0.5、1、2 吋,中心距 A 取 2、4、8、16 吋,兩種筆重(1 盎司與 1 磅),每次試驗 15 秒、間隔 55 秒休息,每人兩天。指導語寫的是「強調準確而非速度」。

只讀到摘要或二手整理的:

  • Harris 與 Wolpert 1998(《Nature》394 卷 780–784 頁,「Signal-dependent noise determines motor planning」):全文頁要登入(WebFetch 被轉到驗證頁),我只讀到搜尋結果與 SISSA 書目頁的摘要層級描述:假設「神經控制訊號被噪音破壞,噪音的變異數隨訊號大小增加」,軌跡形狀被選來「最小化最終位置的變異數」,預測 Fitts 定律以及繪圖時的速度–曲率冪次律。以下我實作的模型細節(受動體的時間常數、觀察窗)來自我的記憶與假設,不是讀到的。
  • Accot 與 Zhai 1997(CHI 97,295–302 頁,「Beyond Fitts’ law: models for trajectory-based HCI tasks」):沒讀到原文,只讀到 Wikipedia、Nielsen Norman Group 的文章與 Zhai 個人網站的整理。整理說他們由「沿軌跡放無限多個目標」的想法推出定律,矩形、錐形、螺旋三種隧道的擬合度都超過 0.96(這是二手轉述)。轉向定律在 1959 年(Rashevsky)與 1971 年(Drury)已被獨立發現過(Wikipedia 的說法,我沒查原文)。
  • Chen 與 Fels 2025(arXiv 2503.11914,「Curves Ahead: Enhancing the Steering Law for Complex Curved Trajectories」):讀了 arXiv 摘要頁與 WebFetch 對 HTML 版的整理,數字是整理給的,我沒逐行核對原文。
  • 近期:搜尋找到兩篇今年的手寫論文(Frontiers in Human Neuroscience 2026 年 5 月 20 日,Galrinho 等人,58 位長者用 Wacom 板做 DOTS 與 LINES 筆控任務加四個書寫速度任務,只有一個聽寫任務的邏輯斯迴歸達顯著,χ² = 20.20、p = 0.017;以及 Frontiers in Aging Neuroscience 2026 年 3 月的敘述性回顧),都不是今天的主題,只讀到整理層級,不引用其結論。另外一篇標示 2026 年 10 月 12 日出刊的兒童握筆輔具研究(MDPI《Children》13 卷 10 期 1385),網頁回 403,我只看到標題,沒有內容。

**沒讀到:**Lacquaniti 等人 1983 原文(仍然)、Meyer 等人 1988 的次動作模型(下文會提到,是我的記憶)。

二、Fitts 1954 Table 1 自己重算

Fitts 定義 ID = log2(2A/W),模型是 T = a + b·ID。我對 1 盎司筆的 16 格做最小平方:

模型(兩個參數)係數R²殘差 rms
T = a + b·log2(2A/W)a = 0.013 s,b = 0.0947 s/位元(1/b = 10.56 位元/秒)0.96627.9 ms
T = a + b·√(A/W)a = 0.121,b = 0.08240.97126.2 ms
T = c·(A/W)^q(對 ln T 擬合)c = 0.1705,q = 0.362—17.7 ms
T = a + b·(A/W)(轉向定律那種線性)a = 0.268,b = 0.00880.84160.7 ms

1 磅筆結果類似:Fitts 式 a = −0.006、b = 0.1048(9.54 位元/秒),R² = 0.960,rms 34.0 ms;冪函數 q = 0.379。對 A/W 線性的版本明顯不行(rms 60 毫秒以上),這件事之後和轉向定律有關:轉向定律是「路徑長除以寬度」的線性式,對「點到點敲擊」不適用,那是兩個不同的任務。

為什麼冪函數比對數直線好?把表按寬度與振幅拆開看就知道:

固定 W,振幅每加倍多花時間(s)固定 A,寬度每減半多花時間(s)
W = 0.25:0.111(R² 0.984)A = 2:0.0705
W = 0.5:0.104(0.994)A = 4:0.0955
W = 1:0.090(0.965)A = 8:0.1015
W = 2:0.070(0.929)A = 16:0.1143

Fitts 定律主張每一個「位元」都花同樣的時間,所以兩欄的數字應該是常數(約 0.095)。實際上在寬目標區每多一個位元只花 0.07 秒,在窄目標區花 0.11 秒,差 1.6 倍,是交互作用。冪函數用 0.36 次方一次吸收了這個趨勢。這和我記憶中 Meyer 等人 1988 提出的「T 正比於 (A/W)^(1/n),n = 2 左右」的方向一致(我記得他們的結論是一個平方根,也記得它由「多次次動作的最佳化」推出,但沒有讀到原文,所以只當線索,這裡我的指數是 0.36,對應 n ≈ 2.8,不是 2)。這是 1954 年的 16 位受試者、手臂大動作(2 到 16 吋),不能直接搬到幾公分的寫字。

**有效寬度:**Fitts 的錯誤率並不一樣,1 盎司筆從 0.00% 到 3.65%(Fitts 文字寫整體平均 1.2%,是依動作數加權;我對 16 格做未加權平均是 1.84%,兩者不衝突,簡單的條件動作數多、錯誤少)。標準做法(MacKenzie 一派的「有效寬度」,我記得這個名稱與 4.133 倍標準差的定義,但沒讀到原文)是以實際的落點散佈重算寬度。我只有錯誤率,沒有落點,所以用常態假設反推:P(錯) = 2[1 − Φ(W/2σ)],有效寬度 We = 4.133σ。結果 We/W 從 0.53(W = 2、A = 2,錯誤率 0.00%,我把它夾到 0.01% 才有定義)到 0.99(W = 0.25)。也就是在寬的目標上,受試者實際打的區域只有目標寬度的一半到八成,「他們沒有用滿容許誤差」。改用 We 算 ID 後,對 T 的直線回歸 R² = 0.980,rms 21.5 毫秒,截距變成 −0.070 秒(負的,不合物理),斜率 0.1083 秒/位元(9.2 位元/秒)。結論是:校正有效寬度後直線擬合明顯變好,但截距為負,表示在小 ID 端那條直線不是這個動作的真實形狀。這個結果有兩個前提是假設:錯誤率服從常態散佈、錯誤沒有偏向單側(Fitts 明說伸展與收回方向不對稱,輕筆時過衝與不足同樣多,重筆時不足約兩倍)。

三、訊號相依雜訊的玩具模型,預測 Fitts 表

Harris 與 Wolpert 的核心主張一句話就能說:控制訊號越大,雜訊越大,所以「用力用得多」就不準,最佳軌跡是讓終點位置的變異最小的那一條。我實作了一個最簡版本,並且先講好哪些是我假設的:

  • 受動體:一單位質量的慣性,前面接兩個一階低通濾波器(肌肉與神經的延遲),時間常數 τ1 = 0.224 秒、τ2 = 0.013 秒。這兩個數字來自我對該論文的記憶,沒有核對,把它當作「一個合理的手臂」而非文獻值。
  • 雜訊:每個 5 毫秒的指令樣本,標準差正比於指令大小。
  • 目標函數:動作結束(時間 T)之後、指令為零的 0.5 秒觀察窗內,位置的變異數總和。約束:T 時刻狀態等於 (位置 D、速度 0、兩個濾波狀態 0)。
  • 解法:這是等式約束的二次規劃,拉格朗日乘子解出閉式 u = W⁻¹Gᵀ(GW⁻¹Gᵀ)⁻¹r,其中 W 是每個樣本影響終點變異的權重,G 是樣本對終點狀態的影響矩陣。

得到的最佳速度曲線是單峰鐘形、對稱性略偏:

動作時間 T(s)終點 SD(任意單位,D = 1)速度峰/均值等價的 Beta 階 p峰值出現位置 / T
0.15148.42.1012.710.53
0.2070.52.0632.580.55
0.3027.02.0152.430.57
0.4511.51.9742.300.59
0.606.671.9502.230.61
0.804.091.9272.160.63
1.002.901.9112.110.65

「等價的 p」是把峰/均值代回 10-12 的閉式 4^(−p)·B(p + 1, p + 1)⁻¹,反解得到。它落在 2.1 到 2.7,也就是介於最小急動度(p = 2,1.875)與最小急跳度(p = 3,2.1875)之間,所以這個模型給的鐘形與 10-12 那兩個「最小導數」鐘形在同一個範圍,動作越慢越接近最小急動度。我不確定的是峰值位置:模型說動作越長,峰值越靠後(0.53 到 0.65),而我印象中的實驗結果是動作越長減速期越長(峰值更靠前)。這個印象沒查證,也可能是我的受動體與觀察窗的假設造成,所以不當結論,只當「這個玩具有一條與我記憶相反的預測」。

終點 SD 對 T 的對數斜率:0.12 到 0.15 秒是 −2.76,0.3 到 0.4 秒是 −2.15,0.6 到 0.8 秒是 −1.70,1.0 到 1.3 秒是 −1.39。也就是動作時間減半,終點散佈約變成 3 到 4 倍,而且「越慢越不划算」(斜率變平)。把 Fitts 的規則「終點散佈 = W/4.133」代入:SD(T)·D = W/(4.133k),k 是雜訊係數,我讓它當單一自由參數,對 16 格擬合 T:

A/W資料(1 盎司,同 A/W 的格子均值,s)模型預測(s)
10.1800.130
40.2730.222
160.4780.412
640.7310.897

模型的整體 rms 是 71 毫秒,比 Fitts 式直線(27.9 毫秒)與冪函數(17.7 毫秒)都差,但它只有一個自由參數(那兩個比較的是兩個參數,不公平),而且形狀不對:模型在小 A/W 端偏快、大 A/W 端偏慢,斜率太陡。敏感度檢查:觀察窗取 0.2、0.5、1.0 秒,rms 是 111、71、49 毫秒,窗越長越貼近資料,但這個窗在論文裡有沒有、取多長,我不知道。所以今天這一節的誠實結論是:這個玩具能重現「速度越快越不準、鐘形單峰、p 在 2 到 3 之間」這三個定性特徵,但定量上沒有擬合出 Fitts 的資料,不能說它「驗證」了訊號相依雜訊理論;沒試的包括受動體時間常數的敏感度、含回饋修正的版本,而 Harris 與 Wolpert 的論文是否有同樣的結果我讀不到。

四、轉向定律:寫一筆等於走一條隧道

點到點是「一個目標」,寫字更像「沿著一條有寬度的路線走完」。Accot 與 Zhai 的轉向定律(依 Wikipedia 與 Zhai 網站整理):

T = a + b ∫ ds/W(s)

W(s) 是路徑上位置 s 處容許的寬度;寬度固定時退化成 T = a + b·(A/W);它的局部形式是 ds/dt = W(s)/b,「速度與容許寬度成正比」。Zhai 網站轉述的實驗結果是矩形、錐形與螺旋隧道都有 0.96 以上的擬合度。注意兩件事。第一,這裡的線性是「路徑長度比寬度」,與上一節 Fitts 的對數形式的點到點定律是兩個不同的任務類型,我的 16 格資料對 A/W 做線性很差(R² 0.84),不代表轉向定律錯,只是我不該把兩者混用。第二,Accot 與 Zhai 原文的 b 與 R² 我沒讀到,所以今天我不引用他們的具體數字。

**與冪次律衝突嗎?**局部式說「只要隧道寬度固定,速度就該固定,曲不曲都一樣」;10-08 到 10-12 一直在寫的冪次律說速度隨曲率 κ 以 κ^(−1/3) 變化。我拿 10-08 用過的 6 公分乘 3 公分橢圓算:周長 29.07 公分(數值積分),主軸端點曲率 0.667 /公分,短軸端點 0.0833 /公分,比值 8。若隧道寬 0.6 公分,轉向定律的 ID = 29.07/0.6 = 48.4。兩條規律在這條橢圓上的差別可以用「側向加速度」表達(我自己推的,不是文獻):側向加速度是 κv²;等速時正比於 κ,兩端差 8 倍;冪次律的 v = gκ^(−1/3) 代入得 g²κ^(1/3),兩端只差 8^(1/3) = 2 倍。也就是說,等速走完這個橢圓,尖端的側向受力是平緩端的 8 倍,按冪次律減速則只有 2 倍;這個差距提供了一個物理上合理的理由,說明為什麼彎得緊的地方該慢,但這不證明人是這樣選的,是推論。

Chen 與 Fels 2025 的實驗直接面對這個問題:固定寬度 50 像素的正弦形路徑,三種長度(約 1500、1882、2320 像素)乘三種總曲率 K = ∫|κ|ds(10、16、22),20 位受試者、各 15 次,共 2,700 次試驗,用滑鼠。依 WebFetch 的整理,傳統轉向定律(MT = a + b·L)的調整後 R² = 0.911、五摺交叉驗證 RMSE 967 毫秒;加上曲率項的最佳模型 MT = a + b·L + c·log2(K + 1) + d·L·K,R² = 0.99、RMSE 372 毫秒,係數 a = −22,052.8、b = 12.0、c = 5,238.3、d = −0.2(d 的 95% 區間 [−0.3, −0.0])。曲率的主效應 F(1,19) = 29.13,p < 0.001。這是用滑鼠,不是筆,而且寬度固定、只有九個條件,所以只能說「彎度確實額外花時間」這個方向對轉向定律的簡單版本不利,不能直接套到寫字的墨跡。

我用整理給的係數(假設 MT 單位是毫秒、L 是像素)算九個條件的預測,得到(單位秒):

L(像素)K = 10K = 16K = 22
150011.112.613.0
188214.915.915.9
232019.319.819.3

最長的路徑上,K 從 10 到 22 幾乎沒有預測差(19.3 與 19.3),與「曲率有顯著主效應」的描述不符。再看 d:它被四捨五入成 −0.2,但在 L = 2320、K = 22 這格,d 取 −0.3、−0.25、−0.2、−0.15、0 時,預測是 14.2、16.7、19.3、21.8、29.5 秒,差距比 RMSE 372 毫秒大了一個數量級。所以不是模型壞,而是整理給的係數精度不夠重算它,我不能用這幾個係數做預測,這張表只用來說明為什麼不能。我也不確定單位的解讀是否正確。

五、今天的實驗要多少筆才夠

要在自己身上量轉向定律的 b,先估需要幾筆試驗。我的假設:T = 0.25 + 0.030·ID(秒),ID = L/W,每筆時間有乘性的對數常態雜訊(變異係數 CV),四種寬度使 ID = 6.25、12.5、25、50,蒙地卡羅各 4,000 次,用直線回歸:

每種寬度的次數(總筆數)CV 8%CV 15%CV 25%
4(16)b 的相對標準差 5.7%,直線勝過 √ID 的比例 96%10.7%,82%18.0%,70%
6(24)4.6%,98%8.7%,87%14.8%,74%
10(40)3.6%,100%6.8%,93%11.3%,81%

(「直線勝過 √ID」是指,同一批資料分別配 T = a + b·ID 與 T = a + b·√ID,前者殘差較小的比例。)只用兩種寬度時完全無法判斷形狀,因為兩個模型都能完美擬合兩個平均值,所以只用兩種寬度的結果(b 的相對標準差 12.6% 到 40.7%)不能用來辯論線性與否。這個模擬假設沒有學習效應、沒有疲勞、不排除失誤試驗,實際資料一定更糟,所以下面的實驗取每寬度 6 筆,這樣在 CV 15% 時 b 的不確定度約 9%。真人的 CV 我沒有數字,10-12 的實驗也沒有量這個。

🧠 記

  • **Fitts 1954 重算:**1 盎司筆 T = 0.013 + 0.0947·log2(2A/W),R² 0.966、10.6 位元/秒;冪函數 T = 0.1705·(A/W)^0.362 殘差 17.7 毫秒對 27.9 毫秒。
  • **位元成本不是常數:**固定 W = 0.25 吋時振幅加倍花 0.111 秒,W = 2 吋時 0.070 秒。有效寬度(We/W 從 0.53 到 0.99)校正後 R² 0.980,但截距 −0.070 秒。
  • **訊號相依雜訊玩具模型:**最佳速度曲線單峰,峰/均值 1.91 到 2.10(等價 p 2.1 到 2.7),動作減半終點散佈變 3 到 4 倍;但對 Fitts 資料 rms 71 毫秒,對觀察窗敏感(49 到 111 毫秒),只重現定性。
  • **轉向定律:**T = a + b ∫ ds/W,局部形式速度正比於寬度;冪次律下側向加速度 ∝ κ^(1/3)(自推),6 乘 3 公分橢圓兩端差 2 倍,等速則差 8 倍。
  • **曲率項:**Chen 與 Fels 2025 滑鼠實驗,加曲率後 R² 由 0.911 升到 0.99,但整理給的係數(d 四捨五入成 −0.2)不足以重算預測。
  • **實驗規模:**每寬度 6 筆(共 24),CV 15% 時 b 的相對標準差約 9%;只用兩種寬度無法辨別線性與否。

**邊界:**Fitts 1954 原文是讀到的,其餘文獻只讀到摘要或二手整理;玩具模型的受動體時間常數與觀察窗是我的假設,且我記憶中的峰值位置趨勢與模型相反,沒查證;有效寬度用了常態假設與錯誤率反推;Chen 與 Fels 的係數與單位未經原文核對;蒙地卡羅假設的 a、b 與 CV 都不是實測;今天沒有任何人的書寫資料,隧道頁面的畫面部分沒有在真實瀏覽器或觸控筆上跑過。

✍️ 實踐

30 分鐘量自己的轉向定律斜率 b,並檢驗「只有 L/W 重要」這個預測。需要 Python 3 與 numpy,一個能用滑鼠、觸控板、或觸控筆的瀏覽器。

**第一步,存成 tunnel.html。**畫面上有一條水平隧道,從綠線(起點)走到紅線(終點),不碰上下壁,時間以起點與終點穿越線的線性內插計算,碰壁就記一次失誤(該筆算失誤並進下一次,不重做);共四種寬度(12、24、48、96 像素)乘 6 筆,順序打散、方向左右交替。我用 Node 單獨測試了核心的 scoreTrial(合成的穩速筆畫:算出 2,499 毫秒、與預期的 600 像素除以速度一致;出壁筆畫回報失誤;沒走完回報未完成;反向也正確);畫面、指標事件與下載按鈕沒在真實瀏覽器上測過,出問題先看 console。

<!doctype html><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>steering tunnel</title>
<style>body{margin:0;font:14px sans-serif}canvas{touch-action:none;display:block;background:#fff}#b{padding:6px}</style>
<div id="b"><span id="s">每寬度 6 筆,寬度順序打散;從左(綠線)穿到右(紅線),不碰壁</span> <button id="d">下載 CSV</button></div>
<canvas id="c"></canvas>
<script>
function scoreTrial(pts, sp) {            // pts:[{t,x,y}] ; sp:{x0,x1,yc,W}
  var dir = sp.x1 > sp.x0 ? 1 : -1, half = sp.W / 2, ts = null, prev = null;
  for (var i = 0; i < pts.length; i++) {
    var p = pts[i], inside = Math.abs(p.y - sp.yc) <= half;
    if (ts === null) {
      if (prev && (prev.x - sp.x0) * dir < 0 && (p.x - sp.x0) * dir >= 0 && inside) {
        ts = prev.t + (p.t - prev.t) * (sp.x0 - prev.x) / (p.x - prev.x);
      }
    } else {
      if (!inside) return {ok: true, error: 1, time: p.t - ts};
      if ((p.x - sp.x1) * dir >= 0) {
        var te = prev.t + (p.t - prev.t) * (sp.x1 - prev.x) / (p.x - prev.x);
        return {ok: true, error: 0, time: te - ts};
      }
    }
    prev = p;
  }
  return {ok: false};
}
(function () {
  var cv = document.getElementById('c'), g = cv.getContext('2d');
  cv.width = Math.min(innerWidth, 900); cv.height = Math.min(innerHeight - 40, 360);
  var L = Math.min(cv.width - 80, 720), X0 = 40, YC = cv.height / 2;
  var Ws = [12, 24, 48, 96], reps = 6, plan = [];
  for (var w = 0; w < Ws.length; w++) for (var r = 0; r < reps; r++) plan.push(Ws[w]);
  for (var i = plan.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var t = plan[i]; plan[i] = plan[j]; plan[j] = t; }
  var n = 0, pts = [], rows = ['trial,W,L,ID,time_ms,error'], drawing = false;
  function spec() { var rtl = n % 2 === 1; return {x0: rtl ? X0 + L : X0, x1: rtl ? X0 : X0 + L, yc: YC, W: plan[n]}; }
  function draw() {
    g.clearRect(0, 0, cv.width, cv.height); if (n >= plan.length) return;
    var s = spec(), x = Math.min(s.x0, s.x1);
    g.fillStyle = '#eee'; g.fillRect(x, YC - s.W / 2, L, s.W);
    g.strokeStyle = '#000'; g.lineWidth = 1; g.strokeRect(x, YC - s.W / 2, L, s.W);
    g.strokeStyle = '#0a0'; g.lineWidth = 3; g.beginPath(); g.moveTo(s.x0, YC - s.W / 2 - 8); g.lineTo(s.x0, YC + s.W / 2 + 8); g.stroke();
    g.strokeStyle = '#d00'; g.beginPath(); g.moveTo(s.x1, YC - s.W / 2 - 8); g.lineTo(s.x1, YC + s.W / 2 + 8); g.stroke();
    g.strokeStyle = '#06c'; g.lineWidth = 1.5; g.beginPath(); pts.forEach(function (p, k) { k ? g.lineTo(p.x, p.y) : g.moveTo(p.x, p.y); }); g.stroke();
    document.getElementById('s').textContent = '第 ' + (n + 1) + '/' + plan.length + ' 次,寬 ' + s.W + ' px,ID = L/W = ' + (L / s.W).toFixed(1);
  }
  function pos(e) { var r = cv.getBoundingClientRect(); return {t: e.timeStamp, x: e.clientX - r.left, y: e.clientY - r.top}; }
  cv.addEventListener('pointerdown', function (e) { if (n >= plan.length) return; cv.setPointerCapture(e.pointerId); drawing = true; pts = [pos(e)]; });
  cv.addEventListener('pointermove', function (e) {
    if (!drawing) return;
    (e.getCoalescedEvents ? e.getCoalescedEvents() : [e]).forEach(function (c) { pts.push(pos(c)); }); draw();
  });
  cv.addEventListener('pointerup', function () {
    if (!drawing) return; drawing = false; var s = spec(), res = scoreTrial(pts, s);
    if (res.ok) { rows.push([n + 1, s.W, L, (L / s.W).toFixed(3), res.time.toFixed(1), res.error].join(',')); n++; }
    pts = []; draw();
  });
  document.getElementById('d').onclick = function () {
    var a = document.createElement('a'); a.href = URL.createObjectURL(new Blob([rows.join('\n')], {type: 'text/csv'})); a.download = 'steer.csv'; a.click();
  };
  draw();
})();
</script>

**第二步,存成 steer_fit.py。**輸出依 ID 分組的平均時間、失誤率與 CV,線性擬合 a 與 b、bootstrap 區間,以及對照 √ID 版本。我用合成資料(a = 0.25 秒、b = 0.030、CV 15%、24 筆、失誤率隨寬度設定)跑過,回收 a = 0.222、b = 0.0295(bootstrap 95% 區間 0.0262 到 0.0329),R² = 0.962,√ID 版本 rms 差 12 毫秒;沒有在真人資料上跑過。

import csv, sys, numpy as np
rows = list(csv.DictReader(open(sys.argv[1])))
W = np.array([float(r["W"]) for r in rows]); ID = np.array([float(r["ID"]) for r in rows])
T = np.array([float(r["time_ms"]) for r in rows]) / 1000.0; E = np.array([int(r["error"]) for r in rows])
print("ID(=L/W)  n  失誤率  無失誤時間均值  SD(s)  CV   (L, W 組合)")
for k in sorted(set(np.round(ID, 1))):
    m = np.round(ID, 1) == k; ok = m & (E == 0)
    combos = sorted(set((int(rows[i]["L"]), int(float(rows[i]["W"]))) for i in np.where(m)[0]))
    if ok.sum() > 1: print("%7.1f %3d %6.1f 區間: [%.4f, %.4f]" % tuple(np.percentile(bs, [2.5, 97.5])))
c2, R22, rms2 = fit(np.sqrt(ID[ok]), T[ok]); print("對照 T = a + b*sqrt(ID): R2=%.3f rms=%.0f ms  (rms 差 %.0f ms)" % (R22, rms2*1000, (rms2-rms)*1000))

**第三步,做實驗。**用你平常寫字的那隻手與裝置,先隨意走 5 次熱身(CSV 不用存,重新整理頁面即可),再走正式的 24 筆,下載 steer.csv,執行 python3 steer_fit.py steer.csv。指示自己「不碰壁,盡量快」,不要刻意放慢某一種寬度。接著做互換檢驗:把程式裡 var L = Math.min(cv.width - 80, 720) 的 720 改成 360,同樣寬度 12、24、48 再跑一輪,把兩個 CSV 的資料列合併成一個檔案(只保留一行標題),再跑一次;腳本依 ID 分組並列出各組是由哪些 (L, W) 組成。

**第四步,對照預測。**預測一:時間隨寬度變窄而增加,失誤率隨寬度變窄而升高(Fitts 表的失誤率最大出現在最難的條件,輕筆 3.65%,這是我讀到的,你的裝置數字會不同)。預測二:線性擬合的 R² 超過 0.9,b 為正;我模擬用的 b = 0.030 只是假設,你的數字可以差一個數量級,不要拿它對照。預測三(轉向定律的獨特預測):(L = 720、W = 24)與(L = 360、W = 12)是同一個 ID = 30,時間應該接近,差距在組內 SD 之內;若 L 較短的一組系統性較慢,代表起步與停止的固定成本(截距 a)比我假設的大,或者人並不只看 L/W。預測四:若 √ID 版本的 rms 比線性還小,代表這個寬度範圍內資料偏向 Fitts 1954 表那種「寬處便宜、窄處昂貴」的凹形,與本文第二節的冪函數發現同方向,但 24 筆在 CV 25% 時只有 74% 的機會分得出線性,不要只靠一個人的一次實驗下結論。

**品質檢查:**去掉失誤筆時窄隧道的樣本會變少且偏向「運氣好」的筆,所以最窄那一格最好至少有 4 筆無失誤,否則加筆數。螢幕觸控與滑鼠的像素與公分的對應不同,只有 L/W 比值有意義,不要把結果換算成每公分幾毫秒。這個實驗只有一個人、一種裝置、一種直線,沒有曲率、也沒有真正的字形,結論只適用於這個簡化版本。

🔗 延伸學習


💬 問 AI

我在研究手寫與繪圖動作的速度–準確度取捨。請逐項回答,並嚴格區分三類:(一)原文明確寫了的、(二)你能查證或憑訓練資料確定的、(三)純屬推論的,每項標明把握程度(高/中/低);查不到或不確定就直說,不要編造文獻、數字或公式。這是學習與實驗設計。
 
【A 組:Fitts 與有效寬度】
1. 我重算 Fitts 1954 Table 1(1 盎司筆):T = 0.013 + 0.0947·log2(2A/W),R² = 0.966;對 A/W 的冪函數 T = 0.1705·(A/W)^0.362 殘差 17.7 毫秒對 27.9 毫秒。固定 W 時振幅每加倍多花 0.111(W = 0.25 吋)到 0.070 秒(W = 2 吋)。這個交互作用在後續文獻裡有沒有被報告過?Meyer 等人 1988 的次動作模型預測的指數是多少、依據什麼?
2. 我用常態假設從錯誤率反推有效寬度 We = 4.133σ,得 We/W 從 0.53 到 0.99,校正後 R² = 0.980 但截距 −0.070 秒。這個作法有沒有方法學漏洞(例如錯誤只有單側、錯誤率 0% 的格子)?標準的有效寬度作法為何要用實際落點分布?
 
【B 組:訊號相依雜訊】
3. Harris 與 Wolpert 1998 的受動體(時間常數 0.224、0.013 秒?)、後動作觀察窗、以及他們對 Fitts 定律預測的形式(對數還是冪函數)分別是什麼?我的玩具模型(慣性加兩個低通濾波、雜訊 SD 正比指令、觀察窗 0.5 秒)只有一個自由參數,對 Fitts 的 16 格 rms 為 71 毫秒,窗取 1.0 秒時 49 毫秒。請說明哪些設定會影響擬合。
4. 該模型預測的最佳速度曲線峰值位置隨動作時間增長而靠後(0.53 到 0.65),與動作越長減速期越長的實驗觀察相反嗎?原因可能是什麼?
 
【C 組:轉向定律】
5. 轉向定律 T = a + b ∫ ds/W(s) 在筆寫(而非滑鼠)任務上的實驗證據有哪些?Accot 與 Zhai 1997 與 1999 的原文數字(b 的量級、R²)是什麼?局部式說速度與寬度成正比,與速度–曲率冪次律衝突時,文獻如何調和?
6. Chen 與 Fels 2025(arXiv 2503.11914)的模型 MT = a + b·L + c·log2(K + 1) + d·L·K,係數 d = −0.2、95% 區間 [−0.3, −0.0],我用四捨五入的係數重算發現 L = 2320 時預測幾乎不隨 K 改變。請核對原文係數的單位與有效位數。
 
【D 組】
7. 把存疑項目分成三堆:(一)憑訓練資料就能判斷的、(二)必須查一手文獻的(請列出先查哪幾篇,Lacquaniti、Terzuolo 與 Viviani 1983 的原始摘要是否包括在內)、(三)必須用實際書寫資料才能回答的。