对CAD圆弧直线不了解的朋友可以先阅读以下博文:
https://blog.csdn.net/iloveas2014/article/details/103837857
https://blog.csdn.net/iloveas2014/article/details/103848611
在本篇开始之前,先给一个动图,演示圆弧等分点的分布及其趋于直线时的极限。
不难看出,趋于直线,等分点就是沿着直线等间距分布。
圆弧等分,基本上要依赖于弧长或者圆心角,半径等,但是我们发现,一般式的6个值非常复杂。
可以看出,圆心半径也简单不到哪里去。用太随意的点,算起来会很复杂,所以此处我们先用回很标准的位置进行计算。
在上图的圆弧中,S为起点,E为终点,圆心为C,于是圆心起点的连线和x轴正半轴的夹角为∠ACS=∠ACO+∠OCS=π/2+α/2。然后现在是顺时针旋转的,也就是负旋转,因此它的角度值为负,即
startAngle=-π/2-α/2
类似地,终点角的角度为
endAngle=-π/2+α/2
现在我们在这段圆弧上取任意一个点P,那么这个点跟圆心的连线和x轴正半轴的夹角ACP就会在startAngle和endAngle之间。而P点则在∠SCE的内部(bulge的绝对值小于1的情况才适用这一说法)。
至于等分,则是把∠SCE等分为n份,然后把每条等分线和圆弧的交点取出来,就得到对应的等分点了。
可见,等分点P1,P2,P3分别对应的是的1/4处,2/4处和3/4处。这些分数在线段上的含义就是定比分点的比例λ。
具体到跟x轴正向的夹角,这3个点对应的角度值就是startAngle+α/4,startAngle+2α/4和startAngle+3α/4。
把分数用比例λ代替,即可得到在∠SCE的λ处的角度值为startAngle+λα。
然后我们又知道,在已知某个点所在圆的圆心和半径,以及该点跟x轴正向的夹角的情况下,我们可以用如下式子算出该点的坐标。
然后角度我们刚才算了,它等于startAngle+λα,接着,cx,cy和R在第15篇的时候已经算出,我们把它给搬过来。
现在我们代入一下看看吧!先看下x
这里我们又遇到了跟15篇相类似的问题,就是三角函数和反三角函数共存的化简问题。
前面我们用二倍角公式展开,演算过程直接把arctanb完整写出来,然后此处需要用两角和差来展开。但这里我觉得太长了,所以用带α的表达式来计算。
展开到这一步,我感觉到自己被卡住了。cos(λα)和sin(λα)无法继续展开,在中学数学里面,λ取不同的值可以得到不同的结果。
如λ=1时,有sin(λα)=sinα
λ=2时,有sin(λα)=sin2α=2sinαcosα
λ=3时,有sin(λα)=sin3α=3sinα-4sin³α
λ=1/2时,有sin(λα)=sin0.5α=sqrt(0.5*(1-cosα))
可见,λ不同得到的结果差别很大,并且展开式之间并无任何诸如通项公式这样的简单关系,所以上式中的cos(λα)和sin(λα)就只能展开到这儿,如果把4arctanb代入到α中也无济于事。
既然α不好化开了,那我们把b化成用α表达的形式吧,然后因为当b趋于0时,α趋于0,所以我们接下来可以用研究α趋于0来代替。
根据第15篇的演算过程,有
这样的话,我们把这个式子代入到上面的式子中,b就被完全化走了。
这个式子蛮简单的了,我们对α取一下极限看看。
化到这里,我们看到了基于夹逼定理的正弦极限的影子。嗯我们再变换一下。
还真是这样子。看来圆弧等分或者定比分点的事情,在趋于直线的极限变化中是无法在非数学编程语言中进行化简了。因为上面的极限不能用初等数学的方法算出一个可以直接把b=0或者α=0代入的表达式中,所以定比分点这个方法在我目前的项目代码里还是需要用if来区分。如果大家有更好的方法,欢迎在博客中给我留言。
上面残留的极限值等于1,所以当凸度等于0时,x坐标等于
嗯,真的是个很线性的变换,λ=0时刚好等于起始点-p,λ=1时更好等于终点p,λ=0.5时刚好等于0。
类似地,y我们也能算出一个值来。
然后我们算下y在α趋于0时的极限。除了最后一项,剩下的部分是无穷-无穷,需要通过一些技巧来化简。
算到这一步,我们用洛必达法则来继续化简,不懂这个的朋友可以给我留言。
艾玛,竟然是0,我们算错了么?没有!把上面的图搬下来吧。
这条弧线当它凸度变成0了,就成了S和E的连线,上面的点的y坐标不正是等于0么?所以我们的推导是正确的!
至此圆弧直线的定比分点及其极限计算完毕,我们可以发现,虽然我们拥有了微积分的知识,但在一些场合,我们仍然无法使用非数学编程语言,全通过初等数学的方法对一些算法进行实现。
但这个没关系,我们至少通过这样的演算找出什么东西是一般的编程语言可以做的,哪些又是无法实现,从而指导我们去往着可优化的方向去进军。能做到这一点,大多数的应用场合,我觉得已经是完全够用了。