对CAD圆弧直线不了解的朋友可以先阅读以下博文:
https://blog.csdn.net/iloveas2014/article/details/103837857
https://blog.csdn.net/iloveas2014/article/details/103848611
另外也建议大家先阅读18篇了解本篇的背景:
https://blog.csdn.net/iloveas2014/article/details/104077372
本篇我本来打算写写如何把第18篇中无法用单条式子表示的部分转移到夹逼公式上。然而在那个时候,由于定比分点的式子过于复杂,加上又缺乏把圆弧和直线统一起来的灵感,所以搞完特殊位置就没推导一般位置了。
如今有了灵感,我就硬着头发推导了一番,发现还是搞不动。因为起点终点角度的式子太繁琐了。
所幸的是,得益于特殊位置的推导,我想到了以中线为基准表示角度的方法。因为只要起点终点确定了,圆心一定在它们连线的垂直平分线上。所以,圆心和连线中点的夹角不受凸度值的影响,可以视为常量。
有了这些基础理论支撑后,我们就先把一般位置的圆心和半径给推导出来,然后下篇再套入到夹逼公式上面
如下图所示,S和E固定的情况下,圆心O'和SE中点C的连线必定与SE垂直,也就是说,不管圆心角怎么变化,OC跟x轴的夹角AO'C都保持不变(有心情的时候做个动图)
这样的话,起点的坐标就可以用圆心,半径和角度来表示了。
记,圆心坐标为(Ox,Oy),则有
然后,如下图所示,在弧SE的上取任意一点P,并且弧长SP/弧长SE=t(0<=t<=1),则有
∠SO'P=tα
然后,P的坐标就可以在上述S坐标的基础上,给角度值加上tα即可求得。
跟18篇一样,我们不直接对凸度取极限,而以α代之。原因在于tα无法直接用三角函数公式进行化开。
在上式中,cα为常量,而Ox,Oy和R则跟α有关,需要用α的表达式代入并化简。
首先我们代入下x坐标,大家做好心理准备了。
记SE向量为(Δx, Δy),则CO'向量可视为由SE向量正向旋转90度(逆时针)所得,其结果为
(cos90°Δx-sin90°Δy, sin90°Δx+cos90°Δy)=(-Δy, Δx)
看不懂这个变换的可自行查阅相关资料或者我写的矩阵旋转教程。
当然了,CO'向量跟SE向量长度不一样,我们算一下它们的比值。
在Rt△O'CS中,有
因此向量CO'要在(-Δy, Δx)的基础上乘上这个比例,得到
让SE中点C加上这个向量,即得圆心坐标为
如前所述,cx和cy是跟α无关的常量,所以计算过程中无需展开,这样处理起来能方便很多。
我们再算下半径,在Rt△O'CS中,有
虽说Δx和Δy都是常量,但是这样一长串根号带着计算感觉还是蛋疼。那我们换换,记L=|SE|。
然后Δx和Δy我们也改用包含L和Cα的表达式代替。
如上图,∠AO'C=-Cα,Δx=|SE|cos(Cα)=Lcos(Cα),Δy=|SE|sin(-Cα)=-Lsin(Cα)。关于符号这里不特别讨论,有质疑的读者可以自行验证。
现在我们再列一下相关的等式:
为了避免大家看晕,定比分点的代入和计算放到下一篇,大家先歇一会,马上给到!