2015年6月12日 星期五

幹嘛懂三角函數或機率?


用不到三角函數的機率雖然真的很高,但人生在世,你永遠不知道會發生什麼事,有一天不小心就遇上了。我自己剛好有切身經驗,分享給大家參考。
很久很久以前,PC的三葉蟲時代,我是剛出道的軟體工程師。公司有一項產品,是特定行業的自動排版工具,其中一項功能,是字型的任意角度旋轉,對這個行業十分重要。今天看來屬於許多作業系統的基本功能,當年則必須購買外掛的字型產生器(例如迄今猶在的華康),但通常僅提供基本的90度旋轉,其餘自理。

任務落到我頭上,工作是把字型產生器吐出來的點陣圖,做360度任意旋轉後,交給後端處理。數學不難,只是基本的三角函數矩陣運算。然而當年PC效能比不上今日功能手機,CPU核心甚至沒有浮點運算(意思是只能算整數,除不盡直接捨棄)。如果缺乏有效率的演算法,旋轉幾個字的工夫,可以吸煙喝茶兼看報。所幸演算法不用我來想。網際網路萌芽之初,搜尋檢索遠不及今天方便,老闆透過學校人脈找到一篇論文,講的就是這題目。花點時間看懂,依樣寫出程式,就讓業務拿去給客戶試用。

剛開始客戶很開心,因為競爭對手採用新進字型廠商的技術,已經做出這項功能,客戶正在猶豫要不要放棄原本的投資(也就是我們),改用對手的產品。正高興穩住牆腳,沒兩天業務回報被客戶打槍,說旋轉的字是歪的。我大吃一驚,螢幕上和印出來看都很完美,怎麼會歪?業務說這行裡的師傅都很敏銳,他們說歪,就肯定不正。忙問這下子會不會掉訂單?業務陰陰一笑,說客戶發現後,馬上拿對手來比,他們也是歪的。有趣的是,歪得一模一樣,可能參考的是同一篇論文。現在就看誰先解決這個問題。

敝人實在欠缺美學素養,左看右瞧都找不出那裡歪,只好到客戶那邊請教專家。師傅說他們本來只覺得怪怪的,後來把字體放大列印,旋轉前後的字對著光線交疊,不正處就一目瞭然了。這麼簡單竟然沒想到。說穿只是邊角上的些微變形,若非相疊對比,實在很難看得出來 。對師傅眼光之銳利,真是佩服到五體投地,當下應允儘速解決,回家挑燈夜戰。

於是回頭逐步檢視原論文的演算法。先前寫程式只是依樣葫蘆,並沒有詳細研究背後的原理。深究後才發現,數學方法仍不脫三角函數、矩陣,厲害處在於充分利用當時CPU所擅長的整數及位元運算,使速度提高百倍以上。經過幾小時反覆查驗比對,終於發現某處的位移量 (offset) 有偏差,稍加修正便得到一張真正完美的旋轉字圖,比對之下殊無二致。

我們靠這一點點「不歪」的功能逐退競爭對手,後來更打下大片江山,歸根究底,只是修正小小的三角函數運算失誤而已。對手沒能及時因應,主要因為他們的技術來自字型廠商;對字型廠商而言,這個小眾市場並非當務之急,隔了好一陣子才修正,時機已逝。事實上我們決定自己動手,也是因為我們的字型供應商不願支援。可見技術掌握在自己手裡,緊要關頭自然便有好處。

至於三角函數,工作多年以來真正用上,似乎也只有這麼一回。然而機會之窗稍縱即逝,手上沒個三兩三,看得見也未必撈得著,不是嗎?

 

原發表於Jeff & Jill的窩,2015/06/12 14:47:22

沒有留言:

張貼留言