已知圆弧的起点端点和凸度计算圆心

最近翻看我以前的博文,看到计算LWPLINE中凸度圆弧的圆心的公式那篇,一时竟想不起这公式是如何推导的了。

http://blog.sina.com.cn/s/blog_66349acf0102vivw.html

这里把推导过程简单描述一下,为了以后不再忘记。

注:本来想发在新浪博客上,奈何人家在维护,要5月才能恢复,已经写好的文,怕丢失,就发到了这里。

 

首先要明确lwpline中圆弧的定义,在Autodesk的文档中能见到两种叙述:

1,凸度是圆弧圆心角的四分之一的正切

2,凸度等于圆弧的弓高和圆弧的前进距离的比,即凸度=2H/L,H为弓高,L为前进的长度,也即弦长。

 

这2种叙述表达的含义是一致的,只是第一种方便计算,第二种更直观。

 

已知圆弧的起点端点和凸度计算圆心

 

从图上可知,此段圆弧的凸度 bulge=2H/L=tan(β)=tan(α/2)

这里α=2β,应该可以证明的。

(补充一下这个证明,见下图,从图上可看出,90 = α/2 + γ  = β + γ,即 β = α/2)

已知圆弧的起点端点和凸度计算圆心

可以想象,以AB的中点C为圆心,以红线段的长度为半径(记为r),以CB为起始位置逆时针旋转90度就能得到O点。

记AB的倾角为θ,则

已知圆弧的起点端点和凸度计算圆心

已知圆弧的起点端点和凸度计算圆心

那么O点的坐标为:

已知圆弧的起点端点和凸度计算圆心

已知圆弧的起点端点和凸度计算圆心        .................................. (1)

 

我们知道 α=2β, 所以:

已知圆弧的起点端点和凸度计算圆心

 

已知圆弧的起点端点和凸度计算圆心

记:

已知圆弧的起点端点和凸度计算圆心

那么:

已知圆弧的起点端点和凸度计算圆心

 

把C点坐标( (x1+x2)/2, (y1+y2)/2), r,以及sin(θ), cos(θ) 带入公式(1),得到O点的坐标为:

已知圆弧的起点端点和凸度计算圆心

已知圆弧的起点端点和凸度计算圆心

 

化简后得:

已知圆弧的起点端点和凸度计算圆心

已知圆弧的起点端点和凸度计算圆心

其中:

已知圆弧的起点端点和凸度计算圆心

 

以上公式是以逆时针劣弧推导的结果,那么对于逆时针优弧以及顺时针优劣弧是否也适用呢?

答案是:适用!不用做任何更改。

 

秘密就在于参数b具有自动调节功能。

下面简单分析一下。

已知圆弧的起点端点和凸度计算圆心

 

上面是逆时针优弧,此时的凸度bulge>1,那么b<0,所以 r<0

 

X = Xc + r*cos(π/2+θ) = Xc + (-|r|)cos(π/2+θ) = Xc + |r|sin(θ) = Xc + |r|cos(π/2-θ) = Xc + |r|cos(θ-π/2)

Y = Yc + r*sin(π/2+θ)= Yc + (-|r|sin(π/2+θ) =  Yc + |r|(-sin(π/2-θ)) = Yc + |r|sin(θ-π/2)

 

即:逆时针旋转一个负的向量,相当于顺时针旋转其反向量(正向量)。

从图上可以直观的看到,实际是顺时针旋转到达的圆心位置。

 


已知圆弧的起点端点和凸度计算圆心

 

这是一个顺时针的劣弧,凸度bulge < 0, |bulge| < 1, 可以得到 b < 0, r < 0

与上面一样的道理,也是顺时针旋转到达圆心位置。

 


已知圆弧的起点端点和凸度计算圆心

 

这是一个顺时针的优弧,bulge<0且 |bulge|>1, 那么 b>0, r>0

对于r>0的情况,仍然是逆时针旋转。

 

====================================

所以,正是由于bulge可正可负,参数b才天生具有调节旋转方向的功能。

因此,无需讨论bulge是否正负,统统使用一组公式即可计算出圆心。

 

最后感慨一句:

Autodesk用凸度的正负表示圆弧的方向,真乃神来之笔。