一,什麼是 AutoCAD 中的凸度
凸度(bulge)是AutoCAD 中一個非常重要和強大的數學工具,它可以以非常簡潔的方式表示一段弧的信息。已知平面內具體兩點座標,以及一個凸度值,即可唯一確定一段弧。
多段線中,凸度的數值放置在線段的兩個端點中的前一個端點上。
二,凸度的具體定義
bulge 的具體值定義爲這段弧所對應的弧度(角度)的1/4的正切值,即
bulge = tan(θ/4) , 其中 θ 是弧本身在其所在圓中所對應的弧度(角度)
bulge 值可以爲正,也可以爲負。約定當 bulge 爲正時表示這段弧是逆時針弧,當 bulge 爲負時表示這段弧爲順時針弧。
根據定義,不難看出,已知起點 A,終點 B,以及其間的凸度值,可以唯一確定一段弧線。
並且,可以推出,bulge 有以下特性:
bulge 的值爲 0,線段 AB 爲一段直線。
bulge 的絕對值小於 1 時,弧線段 AB 爲劣弧;bulge 的絕對值大於 1 時,弧線段 AB 爲優弧;
三,根據凸度值計算弧線的順逆、優劣、圓心、半徑
根據弧的角度和順逆,即可計算凸度值。
反過來,可根據凸度值,得到弧線的弧度(角度),進而結合弧線段起點、終點座標,計算出弧線的圓心和半徑。
根據三角函數,可得求 弧半徑 的公式爲:
R = (|AB|/2) / sin(θ/2)
根據凸度定義,可直接得知弧的順逆,根據凸度是否大於 1 可得知弧線是優劣。
最後,已知弧線段起點、終點座標,順逆,以及弧半徑,計算弧的圓心座標
已知起點S、終點E 和半徑 R,可以先確定兩個可能的圓心 C1(CX1, CY1), C2(CX2, CY2):
思路:
∵ 圓心一定落在弦的垂直平分線上 (連接圓上任意兩點的線段叫做弦)
∴ C1C2 垂直於 SE
∵ 由余弦公式可求出 ∠a = ∠b = acos(|SD|/R) = acos(|SE|/2/R)
由向量的角度定義,可求出向量 ↑SE 的角度(這裏命該角度爲 ∠c)
∴ 可求出向量 ↑SC1 的角度 ∠m = ∠c + ∠a
向量 ↑SC2 的角度 ∠n = ∠c - ∠a
∴ 可求出
CX1 = S.x + cos(∠m) * R
CY1 = S.y + sin(∠m) * R
CX2 = S.x + cos(∠n) * R
CY2 = S.y + sin(∠n) * R
具體計算:
令 length = |SE|,起點座標爲 (startX, startY), 終點座標爲 (endX, endY)
則 a = acos(min(1.0, length/ 2.0 / R)); //防止浮點誤差導致出現 1.00000000xx 而計算失敗
c = atan2(endY - startY, endX - startX);進一步,可得兩圓心座標 (CX1, CY1), (CX2, CY2)
CX1 = startX + cos(c + a) * R;
CY1 = startY + sin(c + a) * R;
CX2 = startX + cos(c - a) * R;
CY2 = startY + sin(c - a) * R;其中,(CX1, CY1) 位於 SE 向量方向的左側,(CX2, CY2) 位於 SE 向量方向的右側
最後,只需要根據弧的順逆和優劣,即可確定圓心座標。
如果是 “順優|逆劣” 則圓心爲 (CX1, CY1),“順劣|逆優” 則圓心爲 (CX2, CY2)。
計算 圓心, 半徑 總結:
已知起點 (startX, startY), 終點(endX, endY) 和凸度 bulge, 求圓心 (CX,CY)
1. θ = atan(|bulge|)*4
2. AB = √((startX-endX)²+(startY-endY)²))
3. R = (AB/2) / sin(θ/2)
4. a = acos(min(1.0, AB / 2 / R)); //具體編程實現上,防止浮點誤差導致出現 1.00000000xx 而計算失敗
c = atan2(endY - startY, endX - startX);
5. CX1 = startX + cos(c + a) * R;
CY1 = startY + sin(c + a) * R;
CX2 = startX + cos(c - a) * R;
CY2 = startY + sin(c - a) * R;
6. bulge < -1 或 0 < bulge < 1 時,CX=CX1; CY=CY1
bulge > 1 或 0 > bulge > -1 時,CX=CX2; CY=CY2
四、其他計算圓心的方式
五,其他參考文章