DXF Parser: направление угла эллипса
Я написал свой собственный анализатор файлов ASCII DXF и столкнулся с проблемой с эллипсами в некоторых конкретных документах.
Кажется, что нет "Группового кода", определяющего направление угла (по часовой стрелке или против часовой стрелки) для параметров начала и конца. В большинстве случаев это против часовой стрелки, но не во всех случаях...
Чтобы упростить, вот визуальный пример:
Как видите, первый имеет начальный угол 135, а второй начальный угол 45... Но эллипсы кажутся идентичными (полукруг, слева)... Это потому, что у первого - по часовой стрелке, а у второго против часовой стрелки...
Очевидно, они правильно отображаются в AutoCAD, но с моим парсером они выглядят так:
Просто потому, что я не знаю, представлены ли углы 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.