一,什么是 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