DXF Parser: направление угла эллипса - PullRequest
16 голосов
/ 23 января 2012

Я написал свой собственный анализатор файлов ASCII DXF и столкнулся с проблемой с эллипсами в некоторых конкретных документах.

Похоже, что нет "Группового кода", определяющего направление угла (по часовой стрелке или против часовой стрелки) для запускаи Конечные параметры.В большинстве случаев это против часовой стрелки, но не во всех случаях ...

Для упрощения приведем визуальный пример:

Ellipse1 Ellipse2

Как выМожно видеть, что первый имеет начальный угол 135, а второй начальный угол 45 ... Но эллипсы кажутся идентичными (полукруг, слева) ... Это потому, что первыйодин из них направлен по часовой стрелке, а второй - против часовой стрелки ...

Очевидно, они правильно отображаются в AutoCAD, но с моим парсером они выглядят так:

Ellipse3

Просто потому, что я не знаю, представлены ли углы CW или CCW ...

Я пропустил код группы или что-то еще?

Информация: в AutoCAD я могувидим, что первый эллипс «Конечная точка малой оси» равен [200, -200, 0], а второй - [-200, 200, 0], я полагаю, что именно так AutoCAD знает, являются ли углы CW или CCW ..Но все, что у меня есть в файле DXF - это «Конечная точка большой оси» и «Отношение большой оси к малой» (число)

HВот файл DXF, соответствующий этому примеру: http://www.woofiles.com/dl-279966-ZvoMjamr-c.dxf

Ответы [ 2 ]

3 голосов
/ 11 сентября 2013

Эллипс может не лежать в плоскости 2D XY, поэтому использование знака Z компонента направления экструзии небезопасно.Вот более общий подход для трехмерного эллипса:

1) Создайте эллипс в плоскости XY с большой осью в направлении + X и двигайтесь против часовой стрелки от начального параметра (групповой код 41) до конечного параметра(код группы 42).Сначала убедитесь, что конечный параметр больше, чем начальный параметр, и добавьте 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.

3 голосов
/ 05 сентября 2013

решено: я забыл учесть вектор выдавливания

Когда оно отрицательное (0,0, -1), углы должны рассматриваться как CCW вместо CW (и наоборот)

...