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

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

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

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

Ellipse1Эллипс2

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

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

Эллипс3

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

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

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

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


person ingham    schedule 23.01.2012    source источник
comment
Решено: я забыл принять во внимание вектор экструзии...   -  person ingham    schedule 23.01.2012
comment
Ваш вопрос очень ясен и хорошо документирован. Поздравляю! Приятно видеть, что вы решили проблему самостоятельно.   -  person cma    schedule 08.02.2012
comment
@ingham Я предлагаю вам взять этот комментарий и добавить его в качестве ответа. Это было ценно для меня, и я хочу проголосовать за ответ, а также за вопрос. Если бы вы могли сказать, как вы использовали вектор экструзии для расчета, был ли он по часовой стрелке или нет, это было бы еще более ценным.   -  person daramarak    schedule 05.02.2013
comment
Пожалуйста, отметьте вопрос как решенный самостоятельно?   -  person Apalala    schedule 21.02.2013


Ответы (2)


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

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

person ingham    schedule 05.09.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.

person user1318499    schedule 11.09.2013