Преобразование вершин LWPOLYLINE, записанных в формате DXF

Автор Тема: Преобразование вершин LWPOLYLINE, записанных в формате DXF  (Прочитано 20664 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Доброго времени суток.

Как пересчитать в глобальную систему координат координаты вершин полилинии, которая сохранена в DXF файле как LWPOLYLINE? Из DXF файла можно прочитать координаты вершин и некоторые три числа, по которым и вычисляются глобальные координаты. Как из этих трёх чисел получить матрицу направляющих косинусов, дабы можно было выполнить обозначенное преобразование?

P.S. Преобразование будет выполняться во внешнем приложении, а не в плагине AutoCAD.

Спасибо.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Группа 210 у примитива LWPOLYLINE содержит вектор нормали примитива. По этому вектору используя Arbitrary Axis Algorithm можно получить матрицу преобразования: http://www.autodesk.com/techpubs/autocad/acad2000/dxf/arbitrary_axis_algorithm_dxf_ab.htm
Следует еще учесть возможность того, что у этой полилинии есть уровень (т.е.  группа 38 отлична от 0) - в этом случае потребуется дополнительный сдвиг.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Для нас это чревато, т.к. мы мосты проектируем. Хотелось бы ссылку и для второго варианта.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Объясняю на пальцах:
1) Получаем матрицу преобразования mat ОСК->МСК (алгоритм по ссылке, которую я дал)
2) Создаем вектор v = [0 0 Z], где Z - уровень полилинии (группа 38)
3) Преобразуем вектор v по матрице преобразования mat и получаем вектор v_wcs
4) Преобразуем точку p_ocs (группа 10) полилинии по матрице mat и получаем точку p_wcs
5) Складываем точку p_wcs и вектор v_wcs - это и будет искомая точка.
Как-то так.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bavilla

  • ADN OPEN
  • Сообщений: 12
  • Карма: 2
Уважаемые коллеги! Можете на моем примере показать, как перевести координаты точки из OCS в WCS? Без использования функций Autocad, простой арифметикой. Мне надо считать узлы полилиний из DXF в стороннем приложении, а в справке по "Arbitrary Axis Algorithm" я мало что понял... Заранее спасибо
Например, для узла LWPOLYLINE:
...
38
500.0
10
-100.0
20
430.0
...
210
-0.216
220
0.976
230
0.0

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bavilla

  • ADN OPEN
  • Сообщений: 12
  • Карма: 2
А так: https://forums.autodesk.com/t5/autocad-r12-r13-r14-archive/dxf-arbitrary-axis-algorithm-in-vb6/td-p/35267 ?
Спасибо, именно так я и пробовал посчитать, но где-то ошибся. Потому и прошу, если есть время и возможность, показать на конкретной точке из моего примера.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Спасибо, именно так я и пробовал посчитать, но где-то ошибся. Потому и прошу, если есть время и возможность, показать на конкретной точке из моего примера.
Времени как обычно нет. Так что показывай свой код. Посмотрим в чем в нём ошибка.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bavilla

  • ADN OPEN
  • Сообщений: 12
  • Карма: 2
вот пример на С, попробовал сделать как описано в http://www.autodesk.com/techpubs/autocad/acad2000/dxf/arbitrary_axis_algorithm_dxf_ab.htm#XREF_24259_DXF_AB


Код - C++ [Выбрать]
  1. struct vector
  2. {
  3.   double x;
  4.   double y;
  5.   double z;
  6. };
  7.  
  8. void cross_product(vector v1,vector v2,vector &result)
  9. {
  10.   result.x = v1.y*v2.z - v1.z*v2.y;
  11.   result.y = v1.z*v2.x - v1.x*v2.z;
  12.   result.z = v1.x*v2.y - v1.y*v2.x;
  13. }
  14.  
  15. void calcOCS2WCS()
  16. {
  17.   vector N;  //Let the given normal vector be called N
  18.   vector Wy;  //Let the world Y axis be called Wy, which is always (0,1,0)
  19.   vector Wz;  //Let the world Z axis be called Wz, which is always (0,0,1)
  20.  
  21.   vector Ax,Ay,Az;
  22.  
  23.   N.x = -0.1525427977445352; //код 210
  24.   N.y = 0.6904568740017512;  //код 220
  25.   N.z = 0.7071067811865475;  //код 230
  26.  
  27.   Wy.x = 0.;
  28.   Wy.y = 1.;
  29.   Wy.z = 0.;
  30.  
  31.   Wz.x = 0.;
  32.   Wz.y = 0.;
  33.   Wz.z = 1.;
  34.  
  35.   if((fabs(N.x)<1/64.)&&(fabs(N.y)<1/64.))
  36.   {
  37.     cross_product(Wy,N,Ax);
  38.   }
  39.   else
  40.   {
  41.     cross_product(Wz,N,Ax);
  42.   }
  43.  
  44.   cross_product(N,Ax,Ay);
  45.  
  46.   Az = N; //N could also be called Az
  47.  
  48.   //Исходная точка в OCS
  49.   double OCS_X = 100.0;
  50.   double OCS_Y = 120.0;
  51.   double OCS_Z = 50.0;
  52.  
  53.   //То что нужно вычислить
  54.   double WCS_X;
  55.   double WCS_Y;
  56.   double WCS_Z;
  57.  
  58.   //Предполагаю, что Ax,Ay,Az представляют матрицу коэффициентов афинных преобразований
  59.   WCS_X = OCS_X*Ax.x + OCS_Y*Ax.y + OCS_Z*Ax.z;
  60.   WCS_Y = OCS_X*Ay.x + OCS_Y*Ay.y + OCS_Z*Ay.z;
  61.   WCS_Z = OCS_X*Az.x + OCS_Y*Az.y + OCS_Z*Az.z;
  62.  
  63. }

« Последнее редактирование: 03-03-2016, 15:05:56 от Александр Ривилис »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
//Исходная точка в OCS
  double OCS_X = 100.0;
  double OCS_Y = 120.0;
  double OCS_Z = 50.0;
Она у тебя вроде бы была совсем другая:
Цитировать
10
-100.0
20
430.0

Не учтена группа 38. Я выше писал, что с ней нужно делать.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bavilla

  • ADN OPEN
  • Сообщений: 12
  • Карма: 2
//Исходная точка в OCS
  double OCS_X = 100.0;
  double OCS_Y = 120.0;
  double OCS_Z = 50.0;
Она у тебя вроде бы была совсем другая:
Цитировать
10
-100.0
20
430.0

Не учтена группа 38. Я выше писал, что с ней нужно делать.

Я взял произвольную точку для примера, пусть группа 38 будет 0.0, тогда ее можно и не учитывать


Оффлайн bavilla

  • ADN OPEN
  • Сообщений: 12
  • Карма: 2
Правильно ли я считаю Ax, Ay, Az? И как правильно их использовать для последующего пересчета координат? Я ради интереса нашел для своего примера коэффициенты афинного преобразования с помощью метода наименьших квадратов, они совсем другие чем Ax,Ay,Az

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я не увидел, чтобы ты у себя в коде нормировал Ax (и Ay и Az). Ты должен разделить их Ax.x, Ax.y, Ax.z на sqrt(Ax.x*Ax.x+Ax.y*Ax.y+Ax.z*Ax.z) (аналогично для Ay и Az). В результате получаешь матрицу преобразования:
| Ax.x  Ay.x  Az.x |
| Ax.y  Ay.y  Az.y |
| Ax.z  Ay.z  Az.z |
Произведение вектора координаты в OCS на эту матрицу даст вектор координаты в WCS
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн bavilla

  • ADN OPEN
  • Сообщений: 12
  • Карма: 2
Спасибо! Правда, уже сам успел разобраться.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Спасибо! Правда, уже сам успел разобраться.
Получилось? Значения совпали с реальными в WCS?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение