我编写了自己的ASCII DXF文件解析器,在某些特定文档中遇到省略号问题。
似乎没有“组代码”定义开始和结束参数的角度方向(顺时针或逆时针)。 在大多数情况下,它是逆时针方向,但并非在所有情况下......
为简化起见,这是一个视觉例子:
如您所见,第一个的起始角度为135,第二个的起始角度为45 ...... 但是,椭圆看起来是相同的(半圆形,在左边)......这是因为第一个角度是顺时针方向,第二个角度是逆时针方向......
显然,它们在AutoCAD中正确显示,但是使用我的解析器,它们看起来像是:
仅仅因为我不知道角度是代表CW还是CCW ......
我是否错过了群组代码?
信息:在AutoCAD中,我可以看到第一个椭圆“Minor Axis Endpoint”是[200,-200,0],而第二个椭圆是[-200,200,0],我想这就是AutoCAD的方法知道角度是CW还是CCW ...但我在DXF文件中的所有内容都是“主轴端点”和“主轴到次轴比”(数字)
以下是与此示例对应的DXF文件:http://www.woofiles.com/dl-279966-ZvoMjamr-c.dxf
答案 0 :(得分:3)
解决:我忘了考虑挤压矢量
当它为负(0,0,-1)时,必须将角度视为CCW而不是CW(反之亦然)
答案 1 :(得分:3)
椭圆可能不在2D XY平面中,因此仅使用挤出方向的Z分量的符号是不安全的。以下是3D椭圆的更通用方法:
1)在XY平面中创建椭圆,主轴在+ X方向,并从开始参数(组代码41)逆时针旋转到结束参数(组代码42)。首先确保end参数大于start参数,如果不是则添加2pi。然后,您可以使用以下方法计算每个点:
X = [length of major radius] * cos(angle)
Y = [length of minor radius] * sin(angle)
2)将其旋转到这个新的坐标系:
Direction of new X axis = endpoint of major axis
Direction of new Z axis = extrusion direction
Direction of new Y axis = [new Z axis] cross product [new X axis]
你可以通过标准化这些向量并制作一个3x3变换矩阵来完成此操作,其中每列包含一个向量,然后将此矩阵乘以步骤1中创建的椭圆中的每个点。