热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

dxf中凸度的计算

以前在做dxf文件解析的时候,对于凸度的处理采用了简单粗暴的方式。见我前面写的博客:https:blog.csdn.netyishang44articl

以前在做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的时候是直线。在计算过程中不会出现多次的判断问题了。把①⑤带入③和④中就可以直接得到圆弧的圆心了。计算简单方便。

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

 


推荐阅读
author-avatar
毛毛-刘庆
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有