dxf中凸度的计算

以前在做dxf文件解析的时候,对于凸度的处理采用了简单粗暴的方式。见我前面写的博客:https://blog.csdn.net/yishang44/article/details/80338533。简直是个繁琐的过程,而在实际的使用过程中,也碰到各种极端情况,代码的bug也暴露出来,比如,doule值的0值判断;极小值做分母造成误差等。简直是折磨的人欲仙欲死的。

后面在CAD中查找资料,碰到另一种凸度描述

我在CAD中画了个图,做了些小标识,如下:

根据凸度的描述,我们可以很简单的得出:凸度 W = \tan \beta。根据圆中角度关系,圆弧的弧度为2\alpha,且\alpha =2\beta,(原因是圆心角是圆周角的2倍)。这个就是凸度的另外一种描述的了。

我们通过凸度计算的是圆弧的圆心和半径。

可以看到\tan \alpha =\frac{L}{2(r-H)} 这里做个变换 \frac{2r}{L}-\frac{2H}{L} = \frac{1}{\tan \alpha }

通过三角函数已知 {\color{Red} \tan \alpha =\tan\left ( 2\beta \right ) = \frac{2\tan \beta }{1-\left ( \tan \beta \right ) ^{2}}=\frac{2W}{1-W^{2}}}                ………………①

                               \sin \alpha = \frac{\frac{L}{2}}{r}=\frac{2\tan \beta }{1+\left ( \tan \beta \right )^{2}}=\frac{2W}{1+W^{2}}

就可以得到    {\color{Red} r = \frac{L}{2}*\frac{1}{2}*(\frac{1}{W}+W)}      ………………………………………………………②                       

然后,就来求解圆心。自然第一反应是不是通过圆的标准公式\left (x-x_{0} \right )^{2}+\left (y-y_{0} \right )^{2}=r^{2} 带入\left ( x_{1} ,y_{1}\right ) \left ( x_{2} ,y_{2}\right )和 r 求解\left (x_{0},y_{0} \right )。尝试之后太复杂了,实在不是个好办法。

这个时候就要转换下思路,这里就可以看出来,数学对于程序员的重要性了。

圆心可以通过A_{1}A_{2}线段上的点旋转90度实现。选择以A_{1}A_{2}的中点A_{0}为旋转中心,(r-H)为半径的点B进行顺时针旋转来得到圆心O。

旋转变换公式,这个很多资料上都有写,这里就不推到了,直接上公式:

{x}'=\left (x-x_{0} \right )*\cos \theta -\left (y-y_{0} \right )*\sin \theta +x_{0}

{y}'=\left (x-x_{0} \right )*\sin \theta +\left (y-y_{0} \right )*\cos \theta +y_{0}

在本问题中θ= 90,公式可以简化成

{x}'=x_{0}-\left ( y-y_{0} \right )

{y}'=y_{0}+\left ( x-x_{0} \right )

\left ( x_{0} ,y_{0}\right )A_{0}的坐标值,\left ( x,y\right )为B点坐标。求解B坐标可以用向量公式\underset{A_{0}B}{\rightarrow} = \lambda \underset{A_{2}A_{1}}{\rightarrow},其中\lambda = \frac{r-H}{L} = \frac{1}{2\tan \alpha }

圆心为 {\color{Red} x= \frac{1}{2}*\left ( \left ( x_{1}+x_{2} \right )- \left ( y_{2}-y_{1} \right ) *\mu \right )}     ………………………………………………③

           {\color{Red} y= \frac{1}{2}*\left ( \left ( y_{1}+y_{2} \right )+ \left ( x_{2}-x_{1} \right ) *\mu \right )}      ………………………………………………④

          {\color{Red} \mu =\frac{1}{\tan \alpha }}                                                 ………………………………………………⑤

在CAD文档中明确说明了,W = 0的时候是直线。在计算过程中不会出现多次的判断问题了。把①⑤带入③和④中就可以直接得到圆弧的圆心了。计算简单方便。

顺便感概下,凸度的表示方法果然是神来之笔,赞美数学。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值