已知一段圆弧的起点、终点、弧度和法向,求此段圆弧的参数方程和参数区间。
圆的参数方程(字母所代表含义可参见【第六回】OCCT之Package Geom的曲线曲面参数方程解析):
P(U) = O + R*Cos(U)*XDir + R*Sin(U)*YDir
这个问题主要应用于二维多段线中圆弧段的求解。在这里我先讲一下二维多段线的构造。
二维多段线
二维多段线由直线段和圆弧段构成,二维的意思是多段线是固定在某一个平面上的,这个平面可由用户任意指定。在ObjectARX中把这个平面称作OCS(object coordinate system, 对象坐标系),两个参数可以确定这个OCS:平面的法向normal,WCS(world coordinate system, 世界坐标系)的原点到OCS的原点的距离,求法可参见
object coordinate systems,
根据坐标系统构造转换矩阵(不包含缩放)。
下面来仔细说一下ObjectARX中二维多段线的参数。
二维多段线的参数有:P1(第1点坐标),...,Pn(第n点坐标);Bulge_1,...,Bulge_n。其中Bulge_n是指第n点是圆弧的起点时,Bulge_n=tan(α/4),其中α是圆弧的夹角(从起点到终点,右手坐标系),如果第n点是直线的起点时,Bulge_n=0。
为什么Bulge_n=tan(α/4)?因为三角函数tan(α)的一个周期是[-π/2, π/2],而因为圆弧的 角度区间为[-2π, 2π],取Bulge_n=tan(α/4),是将圆弧的角度压缩到[-π/2, π/2],这样可以逆向求得α。
问题求解
如下图所示问题的俯视图和侧视图:
如上图所示,点sp和ep分别为圆弧的起点和终点,点mp为线段spep的中点,法向
normal朝向屏幕外,x'轴向为
epsp方向,y‘轴向为以点mp为起点,
normal×
x'方向。当弧度θ为ω>π时,圆弧为arc2,点cp2为此圆弧的圆心;当弧度θ为0<ψ<π时,圆弧为arc1,点cp1为此圆弧的圆心。(ps: 圆弧的走势始终是以sp为起点,逆时针绕至终点ep。基于此,若给定的弧度θ<0,则取绝对值|θ|,并将
normal反向。)
下面列出求解过程的伪代码(假设给定的弧度θ>0)。
mp = (sp+ep)/2;
y’ = normalize(normal×spep);
cp = mp + y’|spmp|cotθ/2;
radius = |spmp|/sinθ/2;
xAxis = normalize(cpsp);
yAxis = normalize(normal×xAxis)。
区间为[0, θ]。