作者StubbornLin (Victor)
看板Soft_Job
標題Re: [請益] 看懂微積分,就會寫程式???
時間Sat Dec 31 11:35:12 2011
實例的話,我以前接過的案子
用上了所有我懂的線性代數
http://blog.ez2learn.com/2009/08/26/pysketch/
一套向量式的繪圖程式,畫圖的部份使用Cairo,所以這部份的數學
都是由函式庫包辦,但除了畫圖以外的部份都得自己去算
一個最簡單的實例,滑鼠的游標離某條線段有多遠?
因為線段不佔有空間,因此得給他一塊虛擬的面積來方便選取
最簡單的方式就是算出滑鼠離線段的最短距離
面積的形狀看起來會像是條香腸
點和線的關係總共有兩種case,第一種是離兩端點的距離在範圍內
所以不管三七二十一,先拿鼠標位置去算和兩端點的距離
夠近的話就表示在範圍內
另一種case,就是算和線段的距離了,最直覺的想法就是去算鼠標位置
和任一端點的向量,和線段之間的投影,去算出法向量來
mp
●
/ |
/ |
/ |
/ |
p1 ●---------------● p2
sp
這樣一來只要先算出 p1 mp 向量在 p1 p2 向量上的影長
接著算 p1 p2 的單位向量,然後算出p1 sp的向量
就能算出法向量 sp mp 也就能得知滑鼠點 mp 到線段 p1 p2 間的距離
但這還有個問題,就是 mp可能是在線段外面
| above |
|-----------------------| p1 p2 line
| below |
mp必需要在 above 和 below的範圍內,否則整個判斷
就變成是對於直線而不是線段,那要如何判斷在範圍內?
很簡單,算出 p1 sp 的向量 和 p2 sp 的向量時,看它的方向正負
就可以知道它是否是在 above 和 below 的範圍內
這是其中典型用到線性代數的例子
還有很多類似的情況,得用這種方式來算出來
這個case最難的部份是手繪圖型辨識,整個case花了兩週
其它部份加起來一週,手繪辨識做一週
手繪辨識的部份用到了更多的線性代數
但說穿了用的都是我會的簡單方法組合起來
沒用到什麼太高等的東西
但是我得說那些東西我大多都是自己學會的
我大一線性代數還被當掉,因為都沒去上課
早在接觸線性代數以前,就多少有算過相關的東西
不過在看了課本上描述的東西後才瞭解
有這樣的一整套系統是用來解決這類問題的
以我以前寫的2.5D地圖引擎來說
http://kaka-demo.ez2learn.com/
像這種地圖,因為是斜向座標系,所以和一般的直角座標間要有個轉換
國中時只懂得從 地圖座標 轉 直角座標
但 直角座標 轉 地圖座標 沒導出來
所以當要判斷滑鼠指在地圖的哪個格子上時
就用了很蠢的方式去算,記得好像是用一個mask
去判斷是否在那型狀內,很蠢,但可以運作
到了高中知道原來可以去算反矩陣
所以地圖座標轉直角座標就可以用公式去算
簡單又有效
所以,以我自己的經驗來說
我認為,有些東西就算你不懂數學也能用較笨的方法達成
但你懂數學的話,方法會聰明許多
而某些應用的領域,可能是你不懂數學就沒辦法處理的
但是數學的領域這麼廣,圖學用的可能是線性代數
如果是密碼學就是數論,影像處理還得扯微積分
機械學習也扯到很多數學
我想沒有多少人可以懂所有的數學領域
所以這種東西是一種專業,對於程式設計某種應用領域上的專業
沒有這樣的專業也能活得很好,因為大部份的應用都將數學包裝好了
然而如果要接觸那些沒被包裝好的部份,數學就成了必需的技能
這就要看對自己的定位在哪裡
我自己對於自己的定位在於高階的應用開發
能用包裝好的東西就用,真的不能的話,有需要再去學
你要知道的是有哪些東西可以用,可以用來做什麼
而不是一鼓腦將那些東西全硬塞進腦子裡
沒有用到很快就忘了 浪費時間而已
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.170.210.161
推 codemonkey:我記得StubbornLin一直有在玩遊戲繪圖、圖學的東西 12/31 11:37
→ codemonkey:這些領域不用數學好像也不行 12/31 11:37
→ StubbornLin:嗯 有在用的東西學很快 沒在用硬學的話 12/31 11:43
→ StubbornLin:連那東西可以做什麼學完都還不知道 = = 12/31 11:43
→ StubbornLin:我的同學們很多可能在學線代都會覺得這有啥用 12/31 11:43
→ StubbornLin:但我在學時就瞭解以前導的公式原來都有一整套系統 12/31 11:44
→ StubbornLin:那就是線性代數 12/31 11:44
推 codemonkey:我的話就是離散的東西用比較多 12/31 11:46
推 hidog:線代到後來可以跟可積函數結合 12/31 11:54
→ hidog:實際上 可積函數本身可形成一個vector space 12/31 11:54
→ hidog:在這樣的條件下 可以討論很多力學 流體等等的數值計算 12/31 11:55
→ StubbornLin:喔 線代的書上好像有看過 12/31 11:55
→ StubbornLin:但那超過我領域太多 第一眼看到想不到用途的東西 12/31 11:55
→ StubbornLin:對我來說真的通常都不會用到 12/31 11:56
→ hidog:是阿 因為我學生時代碰的是應數 有時候會想,沒走數學很可惜 12/31 11:56
→ hidog:但是走了在台灣又找不到工作 QQ 現在人在遊戲廠碰博奕遊戲 12/31 11:56
→ StubbornLin:那你至少用得上機率論阿 XD 12/31 11:57
→ hidog:要說跟數學最有關的大概是機率吧? 博弈總是跟機率扯上邊 12/31 11:57
→ hidog:是阿XD 是還好我學的很雜 要轉很方便 (當年代數修到99分) 12/31 11:57
→ hidog:結果沒走加密演算法幹嘛的 念一堆東西現在也用不到XD 12/31 11:58
→ howshou:資訊領域統計用得超多的吧,不過統計與機率密不可分 12/31 11:59
→ StubbornLin:科科 我統計學也被當 XD 12/31 12:01
→ hidog:我統計學沒被當 但是是我數學唯一念不來的東西 12/31 12:04
→ hidog:結果後來才發現這東西用的超廣 幾乎到處都用的到~_~ 12/31 12:04
→ StubbornLin:反正 要用到再去學 記得當時學一堆啥鬼卡方檢定的 12/31 12:06
→ StubbornLin:到現在也從沒用過 12/31 12:06
推 hidog:出了社會後,熟悉開發環境是第一步吧 ? 學校學的都是基礎 12/31 12:09
→ hidog:基礎好,以後進步會比較快 但是學校學的跟就業市場要的 12/31 12:09
→ hidog:本來就不見得一定會有關係 這是我的感覺啦@@ 12/31 12:09
推 andymai:推~不懂數學可能也可以做~但是懂數學~真的瞬間聰明許多... 12/31 13:00