我想三角函數的使用機會,做測量業務的應該會是最熟。在下最近因為工作需求,業主要求我利用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 |
沒有留言:
張貼留言