Подтвердить что ты не робот

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

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

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

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

Ellipse1Ellipse2

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

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

Ellipse3

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

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

Info: В AutoCAD я вижу, что первый эллипс "Малая конечная точка оси" - [200, -200, 0], а второй - [-200, 200, 0], я полагаю, это так, как AutoCAD знает, являются ли углы CW или CCW... Но все, что у меня есть в файле DXF, это "Основная осевая конечная точка" и "От среднего до малого" (число)

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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