Разобрать неполные эллипсы из файлов DXF

Я разрабатываю синтаксический анализатор DXF, используя dxflib библиотека. У меня проблема с разбором эллипсов.

Когда я анализирую эллипс, я получаю следующие данные:

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

Как мне рассчитать правильные углы (а также начальную конечную точку сегмента дуги)?

2

Решение

    /// <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 ++ и C #.

Я считаю, что эти вспомогательные функции помогут преодолеть разрыв между тем, что дает вам спецификация DXF, и тем, что требуется для рисования Дуги в WPF.

1

Другие решения


По вопросам рекламы [email protected]