注:我在这里撰写的对空间解析几何性质的分析都将是能直接应用到软件开发中,所以对这些性质的分析后都会列出最终的公式出来。
已知圆弧上起点、中间任意一点、终点,求这段圆弧
要求出这段圆弧并最终能在屏幕上光滑地显示出来,我采用求解圆弧的参数方程的形式(事实上,在绝大部分的几何造型平台中,为了显示及运算需要,一般都会采用参数方程的形式来表示曲线和曲面)。
圆的参数方程(字母所代表含义可参见【第六回】OCCT之Package Geom的曲线曲面参数方程解析):
P(U) = O + R*Cos(U)*XDir + R*Sin(U)*YDir现在开始求解。
设圆弧上这三点分别为A,B,C,现在要求出这段圆弧的圆心O,半径R,弧度范围[Umin, Umax],单位横轴XDir和单位纵轴YDir。如下图所示圆弧:
其中点D,E分别为线段AB,BC的中点,根据三角线外心的性质(三角形外心为各边中垂线的交点),EO⊥BC, DO⊥AB。那么现在可列出两个应用性质(粗体表示向量):
EO = ED+DO,
EO·BC = 0.
则通过这两个应用性质可以求出圆心O,设直线DO的向量方程为:
P(λ) = D + λvDir
则可设DO=λvDir,代入上式:
(ED+λvDir)·BC = 0.
λ=-(ED·BC)/(vDir·BC).
现在只要知道直线DO的方向单位向量vDir,就可求出λ,进而求出圆心O。
vDir的求法可使用三维直角坐标系的性质,得到弧面的单位法矢:vNormal = normalize(AB×BC),然后可求得vDir = normalize(vNormal×AB)。
其中一线段的中点可通过该线段两端点坐标求和再除以2得到。
求出了圆心O,半径即为圆心O到点A,B,C中任意一点的距离。
可求单位横轴XDir=normalize(OA),单位纵轴YDir=normalize(vNormal×XDir)。则可得弧度范围中Umin=0。
现在需要求出弧度范围中的Umax,分两种情况,如下图所示:
圆弧分两种:优弧和劣弧。优弧上的弓形角(几何原本中的定义:在一段圆弧上取一点,连接这点和这段圆弧的底的两个端点的二直线所夹的角叫做这段圆弧的弓形角。)是锐角,如右图所示;劣弧上的弓形角是钝角,如左图所示。
判断圆弧ABC是优弧还是劣弧,就通过判断圆弧上的弓形角是锐角还是钝角,弓形角α,β = arccos(normalize(BC)·normalize(BA))。
优弧上圆心角即Umax的计算式:ω = 2π-arccos(normalize(OA)·normalize(OC)),
劣弧上圆心角即Umax的计算式:ψ = arccos(normalize(OA)·normalize(OC))。
至此,圆弧的参数方程中所有的参数均已求出。