2015-11-17

VBA中三角函數的問題..

做工程的,要計算一些數據,總跑不掉需要運用三角函數,不知道各位是否也像我一樣,只記得SIN / COS / TAN 這三個函數?


我想三角函數的使用機會,做測量業務的應該會是最熟。在下最近因為工作需求,業主要求我利用AutoCAD將圓弧車道磚一塊一塊給畫出來,



各位可以發現,每個弧線因半徑不同又要畫出等弦距的分割,造成每排正交車道方向的磚縫位置皆在不同地方,這個要用人工來畫圖,不畫死才怪。在下也很排斥手工來做,無奈業主要求只好請求程式來協助繪圖了。

不過今天要談的不是怎麼畫出那些細細的分割,而是一些程式撰寫中遇到的問題,並與各位分享交流~~

一  關於PI(π)
你在程式中若遇到PI,你會用什麼數值? 3.14? 3.14159? 3.14159265358979? or 更細的精度?我的用法是PI=(atn(1)*4),這個用法除了VBA上我會應用,在Excel中計算座標方位時也可利用,只是Excel中的函數是atan。

 二 關於arcTan(Tan-1)所算出來的夾角問題
我們知道夾角=atn(y/x),不過這裡有幾個陷阱需處理,否則程式出來的值是錯的或是錯誤。
基本上上述公式只適合在卡式座標系統的第一與第四象限,做工程的是360度,哪有哪個象限的問題,所以只好利用程式來修正嚕。

另做測量的大大是以北方為0度的方位角系統,所以有請自行修正相關數據嚕..

 2.1 小心當x=0時會發生程式錯誤。
 2.2 當X=0時 角度是90度 或 -90度 ??當Y=0 角度是0度 還是 180度,須要額外判斷。
 2.3 當x,y 落在第二與第三象限,角度需要+180度 和 -180度來修正,否則數據是錯的(重要,不易抓到錯)。
 2.4 注意三角函數算出來的數據是徑度量,非度分秒單位。當然所有函數的運算角度單位也是徑度量。

三 arcSin(Sin-1) 與 arcCos(Cos-1)
VBA中並未提供完整的三角函數功能,比如利用arcSin反算夾角的功能就沒,這部份你需要另寫函數來符合他,以下是部分需要額外處理的函數公式,請參考:


函數 由「基本」函數導出之公式
Secant(正割) Sec(X) = 1 / Cos(X)
Cosecant(餘割) Cosec(X) = 1 / Sin(X)
Cotangent(餘切) Cotan(X) = 1 / Tan(X)
Inverse Sine
(反正弦)
Arcsin(X) = Atn(X / Sqr(-X * X + 1))
Inverse Cosine
(反餘弦)
Arccos(X) = Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1)
Inverse Secant
(反正割)
Arcsec(X) = Atn(X / Sqr(X * X - 1)) + Sgn((X) - 1) * (2 * Atn(1))
Inverse Cosecant
(反餘割)
Arccosec(X) = Atn(X / Sqr(X * X - 1)) + (Sgn(X) - 1) * (2 * Atn(1))
Inverse Cotangent
(反餘切)
Arccotan(X) = Atn(X) + 2 * Atn(1)
Hyperbolic Sine
(超正弦)
HSin(X) = (Exp(X) - Exp(-X)) / 2
Hyperbolic Cosine
(超餘弦)
HCos(X) = (Exp(X) + Exp(-X)) / 2
Hyperbolic Tangent
(超正切)
HTan(X) = (Exp(X) - Exp(-X)) / (Exp(X) + Exp(-X))
Hyperbolic Secant
(超正割)
HSec(X) = 2 / (Exp(X) + Exp(-X))
Hyperbolic Cosecant(超餘割) HCosec(X) = 2 / (Exp(X) - Exp(-X))
Hyperbolic Cotangent(超餘切) HCotan(X) = (Exp(X) + Exp(-X)) / (Exp(X) - Exp(-X))
Inverse Hyperbolic Sine(反超正弦) HArcsin(X) = Log(X + Sqr(X * X + 1))
Inverse Hyperbolic Cosine(反超餘弦) HArccos(X) = Log(X + Sqr(X * X - 1))
Inverse Hyperbolic Tangent(反超正切) HArctan(X) = Log((1 + X) / (1 - X)) / 2
Inverse Hyperbolic Secant(反超正割) HArcsec(X) = Log((Sqr(-X * X + 1) + 1) / X)
Inverse Hyperbolic Cosecant HArccosec(X) = Log((Sgn(X) * Sqr(X * X + 1) + 1) / X)
Inverse Hyperbolic Cotangent
(反超餘切)
HArccotan(X) = Log((X + 1) / (X - 1)) / 2







沒有留言:

張貼留言