关于DXF文件读取的小结

这里就轮到椭圆了。实际上,在DXF中,椭圆和椭圆弧是同一套描述,只是在参数值不一样罢了。如下图红圈标识的。

 

这里可以看出来,椭圆就是闭合属性的。

通过椭圆的组码,可以看出来DXF文件对于椭圆的描述和椭圆的标准方程()是不一致。而是使用的参数方程

来个椭圆的实例:

0
ELLIPSE
  5
27D
330
1F
100
AcDbEntity
  8                            //图元图层信息
测试1
100
AcDbEllipse
 10                        //椭圆中心坐标X
2331.726135418688
 20                        //椭圆中心坐标Y
1387.749676511899
 30                        //椭圆中心坐标Z
0.0
 11                        //椭圆长轴端点X
-11.66081242845666
 21                        //椭圆长轴端点Y
4.715658563840861
 31                        //椭圆长轴端点Z
0.0
210
0.0
220
0.0
230
1.0
 40                        //椭圆短轴与长轴的比例 //一般小于1.0
0.4573408781063685
 41                        //椭圆起始弧度
0.0
 42                        //椭圆结束弧度
6.283185307179585

在这里要解释下椭圆长轴端点坐标,这个值是相对于椭圆中心点的偏移。

求解椭圆长轴长度就是 len =fsqrt( pow(组码11,2)+pow(组码21,2))

求解椭圆的短轴就是len2 = len * (组码40)

在DXF文件中,椭圆长轴是可以在任意方向的。就是说,椭圆完全是可能,而且一定存在斜着的。在Windows系统提供的API中,椭圆只能是水平或者竖直的。在这里的解决方法就是:先按照水平求解椭圆方程,然后根据长轴端点坐标求解出旋转角度。

组码41,42表示的位置方向是弧度。这个需要注意下。

所以,综合之后,椭圆上的点求解公式就成为                                                                                                                            x = c_x + (A*cos(θ)*cos(φ) - B*sin(θ)*sin(φ) )                                                                                                                      y = c_y + ( A*sin(θ)*cos(φ) + B*cos(θ)*sin(φ) )                                                                                                                      θ是椭圆旋转的角度,c_x ,c_y 表示椭圆中心点坐标。

要将任意角度旋转的椭圆绘画出来,决定将椭圆分解成连续多线段,在精度范围内分解椭圆。

下面就是分解椭圆的函数:                                                                                                                                                    int Assist_DxfY2PX_DXF(Dxf_LeiYuan& SurY, const double dRefLLen, CRD2D_V& PVDest)

{
 if (!PVDest.empty())
 PVDest.clear();
 //类圆坐标点公式
 //x = c_x + ( ilar*cos(Sweep)*cos(theta) - isar*sin(Sweep)*sin(theta) )
 //y = c_y + ( ilar*sin(Sweep)*cos(theta) + isar*cos(Sweep)*sin(theta) )
 
 //先转为多线段
 if (SurY.l1dlar < dRefLLen*1.732)
 return 1;
 
 //分解类圆
 double dcenX = SurY.X;
 double dcenY = SurY.Y;
 double dLAR = SurY.l1dlar;
 double dSAR = SurY.l1dsar;
 double dSweep = SurY.dSweepA;
 double dagStart = SurY.dSAngl;
 double dagEnd = SurY.dEAngl;
 if(dagStart > dagEnd)
 dagEnd += 360.0;
 
 double dTheta = 2.0 * asin(dRefLLen/(dLAR+dSAR));
 if(dTheta < 0)
 dTheta += PI_pgy;
 dTheta = dTheta * 180.0/PI_pgy; 
 dSweep = dSweep/180.0*PI_pgy;
 
 long lLineN = double2int_add_pgy( (dagEnd-dagStart)/dTheta) + 1; 
 for(long lIndex = 0; lIndex < lLineN; ++lIndex)
 {
 double dTemA = 0.0; 
 Coord2D c2dPoint;
 dTemA = dagStart+lIndex*dTheta;
 if (dTemA > dagEnd)
 dTemA = dagEnd;
 
 dTemA = dTemA/180.0*PI_pgy;
 
 c2dPoint.X = dcenX + ( dLAR*cos(dSweep)*cos(dTemA) - dSAR*sin(dSweep)*sin(dTemA) );
 c2dPoint.Y = dcenY + ( dLAR*sin(dSweep)*cos(dTemA) + dSAR*cos(dSweep)*sin(dTemA) );
 
 PVDest.push_back(c2dPoint);
 } 
 return 0;

}

椭圆基本上就是这些了。

而对于椭圆弧,就是组码41,42的改变罢了,完全可以套用椭圆中的东西的。
————————————————
版权声明:本文为CSDN博主「yishang44」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yishang44/article/details/80357832

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MFC(Microsoft Foundation Class)是微软公司提供的一套用于开发Windows应用程序的类库,它提供了一系列的类和函数,方便开发者进行Windows应用的开发。 而DXF(Drawing Exchange Format)是一种用于CAD(Computer-Aided Design,计算机辅助设计)软件的文件格式,用于存储二维或三维图形数据。 要在MFC中读取DXF文件,可以通过以下步骤完成: 1. 打开DXF文件:使用MFC提供的CFile类打开DXF文件,并进行读取操作。 2. 解析DXF文件DXF文件采用特定的文本格式,其中包含了用于描述图形的实体、图层、属性等信息。可以逐行读取DXF文件内容,并根据特定的关键字进行解析,将图形数据提取出来。 3. 创建图形对象:根据DXF文件中的图形数据,可以在MFC应用程序中创建相应的图形对象,如直线、圆等。可以使用MFC提供的GDI(Graphic Device Interface,图形设备接口)函数或自定义的类库来实现。 4. 显示图形:将创建的图形对象绘制到MFC应用程序的窗口中,可以使用MFC提供的绘图函数来实现。 需要注意的是,DXF文件的解析需要根据具体的DXF版本进行,不同的版本可能有一些差异。另外,MFC作为一个老旧的类库,可能并没有直接提供读取DXF文件的特定函数,需要根据自己的需求进行更多的开发和调试工作。 总之,通过以上步骤,可以在MFC应用程序中实现对DXF文件读取和显示,从而实现与CAD软件的交互和数据处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值