DXF Parser: направление угла эллипса

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

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

Чтобы упростить, вот визуальный пример:

ellipse1ellipse2

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

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

Ellipse3

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

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

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

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

2 ответа

Решение

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

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

Эллипс может не лежать в плоскости 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]

Вы можете сделать это путем нормализации этих векторов и создания матрицы преобразования 3х3, где каждый столбец содержит один из векторов, а затем умножить эту матрицу на каждую точку эллипса, созданного на шаге 1.

Другие вопросы по тегам