Определение угла поворота по матрице трансформации блока

Автор Тема: Определение угла поворота по матрице трансформации блока  (Прочитано 5564 раз)

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

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Добрый вечер всем!
Можно как-то определить угол из матрицы трансформации блока?
Тестовый пример:
Код - C# [Выбрать]
  1.      [CommandMethod("Test")]
  2.       public void Test()
  3.       {
  4.          Document doc = Application.DocumentManager.MdiActiveDocument;        
  5.          Database db = doc.Database;
  6.          Editor ed = doc.Editor;
  7.  
  8.          // Выбор первого блока
  9.          var prOpt = new PromptEntityOptions("Выбери блок");
  10.          prOpt.SetRejectMessage("Только блок");
  11.          prOpt.AddAllowedClass(typeof(BlockReference), true);
  12.  
  13.          var prRes = ed.GetEntity(prOpt);
  14.          if (prRes.Status != PromptStatus.OK)
  15.          {
  16.             ed.WriteMessage("\nПрервано пользователем.");
  17.             return;
  18.          }
  19.  
  20.          // Определение угла вложенного блока относительно модели
  21.          using (var t = db.TransactionManager.StartTransaction())
  22.          {
  23.             // Выбранный блок
  24.             var blRef1 = prRes.ObjectId.GetObject(OpenMode.ForRead, false, true) as BlockReference;
  25.             // Определение блока
  26.             var btr1 = blRef1.BlockTableRecord.GetObject(OpenMode.ForRead) as BlockTableRecord;
  27.             // Пербор объектов в блоке
  28.             foreach (var idEnt in btr1)
  29.             {
  30.                // Если это вхождение блока
  31.                var blRef2 = idEnt.GetObject(OpenMode.ForRead, false, true) as BlockReference;
  32.                if (blRef2 == null) continue;
  33.  
  34.                // Найти угол второго блока относительно модели используя матрицу трансформации первого блока???
  35.                Matrix3d transToModel = blRef1.BlockTransform;
  36.                double rotation2 = blRef2.Rotation;
  37.  
  38.                double rotation2InModel = TransformRotation(rotation2, transToModel);
  39.  
  40.                ed.WriteMessage($"\nУгол вложенного блока '{blRef2.Name}' в модели = {rotation2InModel * (180 / Math.PI)}");
  41.             }
  42.             t.Commit();
  43.          }        
  44.       }
  45.  
  46.       private double TransformRotation(double rotation, Matrix3d transToModel)
  47.       {
  48.          // Вот так неправильно получается
  49.          return rotation + transToModel.Translation.Convert2d(new Plane()).Angle;
  50.       }
Есть функция определения наложения блоков, она рекурсивно входит во вложения блоков. При этом матрицу трансформации я передаю дальше. Думал, что угол поворота можно из матрицы получить. Или могу угол отдельно передавать.

Спасибо!

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
ИХМО проще передать угол - т.к. с матрицей может быть неоднозначность.

Отмечено как Решение Вильдар 28-02-2016, 08:38:16

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

  • Administrator
  • *****
  • Сообщений: 13880
  • Карма: 1786
  • Рыцарь ObjectARX
  • Skype: rivilis
ИХМО проще передать угол - т.к. с матрицей может быть неоднозначность.
Правильнее сказать, что "вероятность однозначности стремится к 0" :)
Величину угла поворота можно получить из матрицы только если уверен, что:
1) Матрица содержит только поворот - нет переноса, масштабирования и поворот вокруг только одной оси.
2) Знаешь точку, являющуюся центром поворота.
3) Знаешь ось, вокруг которой осуществляется поворот.
Короче проще с этим не заморачиваться...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Правильнее сказать, что "вероятность однозначности стремится к 0"
Ну вот - теперь у автора нет стимула понимать что такое матрица преобразования.

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 409
  • Карма: 77
  • Skype: vildar82
Ок, спасибо. Буду угол передавать.