c++ - 解析DXF文件中不完整的椭圆

我正在使用dxflib库开发一个dxf解析器。解析省略号时遇到问题。
当我解析一个椭圆时,我接收到以下数据:

struct DL_EllipseData 
{
    /*! X Coordinate of center point. */
    double cx;
    /*! Y Coordinate of center point. */
    double cy;

    /*! X coordinate of the endpoint of the major axis. */
    double mx;
    /*! Y coordinate of the endpoint of the major axis. */
    double my;

    /*! Ratio of minor axis to major axis. */
    double ratio;
    /*! Startangle of ellipse in rad. */
    double angle1;
    /*! Endangle of ellipse in rad. */
    double angle2;
};

问题是当angle1 != 0 AND angle2 != 2* Math.PI椭圆打开时,我无法计算表示该几何图形的弧路径。
例如考虑以下椭圆:
这些是它的特性:
如你所见,角度是:
angle1 = 0.81855 // 46 degrees
angle2 = 2.38934 // 136 degrees

但是椭圆的图片(我从autocad中获取的)看起来有着非常不同的角度。
遵循表示椭圆的DXF文件的部分:
0
ELLIPSE
  5
A7
330
1F
100
AcDbEntity
  8
DL-Wall
 48
25.0
370
    -3
100
AcDbEllipse
 10
906.6576677029225
 20
906.657675539829
 30
0.0
 11
-641.4561777354752
 21
641.4561777354752
 31
0.0
210
0.0
220
0.0
230
1.0
 40
0.9999999999999978
 41
0.8185500151218715
 42
2.389346341916759

如何计算适当的角度(以及弧段的起点和终点)?

最佳答案

    /// <summary>
    ///     Static method to detemine the WPF end point of the arc.
    /// </summary>
    /// <param name="arc">The DXF ArcEntity object to evaluate</param>
    /// <returns>Point with values of the arc end point.</returns>
    public static Point calcEndPoint(Arc arc)
    {
        double x = (Math.Cos(arc.endAngle * (Math.PI / 180)) * arc.radius) + arc.center.X;
        double y = arc.center.Y - (Math.Sin(arc.endAngle * (Math.PI / 180)) * arc.radius);
        return new Point(x, y);
    }

    /// <summary>
    ///     Static method to detemine the WPF start point of the arc.
    /// </summary>
    /// <param name="arc">The DXF ArcEntity object to evaluate</param>
    /// <returns>Point with values of the arc start point.</returns>
    public static Point calcStartPoint(Arc arc)
    {
        double x = (Math.Cos(arc.startAngle * (Math.PI / 180)) * arc.radius) + arc.center.X;
        double y = arc.center.Y - (Math.Sin(arc.startAngle * (Math.PI / 180)) * arc.radius);
        return new Point(x, y);
    }

    public static bool checkArcSize(Arc arc)
    {
        double angleDiff = arc.endAngle - arc.startAngle;
        return !((angleDiff > 0 && angleDiff <= 180) || angleDiff <= -180);
    }

使用system.windows.media.path、pathFigure、arcSegment:
PathFigure figure = new PathFigure();
figure.StartPoint = calcStartPoint([your arc struct]);
ArcSegment arc = new ArcSegment();
arc.Point = calcEndPoints([your arc struct]);
arc.RotationAngle = Math.Abs(endAngle - startAngle);
arc.Size = new Size(radius, radius);
arc.IsLargeArc = checkArcSize([your arc struct]);
figure.Segments.Add(arc);

您需要调整每个帮助函数来使用您的结构,以及任何C++语法上的差异。
我相信这些helper函数将在DXF规范提供给您的内容和在WPF中绘制弧所需的内容之间架起桥梁。

本文翻译自 https://stackoverflow.com/questions/31137778/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 c++ parsing angle ellipse dxf


相关文章:

c++ - 将包含数字的字符串解析为整数数组

html5 - HTML5 Canvas在Google Chrome中旋转-糟糕的渲染

c++ - 如何在OpenGL中截取屏幕截图

c++ - C ++应用程序退出错误代码62097-这是什么意思?

html - (AS3)换行后在文本字段中获取HTML特定的字符索引

c - 在文本文件中搜索字符串并解析该行(Linux,C)

css - 创建与CSS3规范完全相同的SVG linearGradient

android - 获取Android相机设备的视角

c++ - 这第二个新内容是什么?

c++ - 返回向量(返回类型)