Поворот элемента в соответствии с другим элементом

Автор Тема: Поворот элемента в соответствии с другим элементом  (Прочитано 1889 раз)

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

Оффлайн bronxАвтор темы

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
Приветствую. Просьба подсказать , как можно повернуть элемент - большой круг(смотри вложение), чтобы он был в той же плоскости, что и маленький. Т.е. чтобы получилось, как на второй пикче.





Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Берем нормали плоскостей большого и малого кружков, вычисляем их векторное  произведение (CrossProduct). Если получился нулевой вектор, то значит плоскости либо параллельны, либо совпадают. Если нет, то получившийся вектор - ось вращения. Дальше считаем угол в плоскости, определенной нормалью получившегося вектора (AngleOnPlaneTo). Поворачиваем вокруг рассчитанной оси на заданный угол. Круги на параллельных плоскостях, дальше перемещаем к заданной, это, вроде, совсем просто

Оффлайн bronxАвтор темы

  • ADN OPEN
  • Сообщений: 10
  • Карма: 0
не работал с AngleOnPlaneTo. Приведу пример кода, поправте, если будут недочёты.

Код - C# [Выбрать]
  1. var crossProduct = bigCircleNormal.CrossProduct(smallCircleNormal);
  2. var angle = crossProduct.AngleOnPlaneTo(smallCircleNormal, XYZ.BasisZ);
  3. ElementTransformUtils.RotateElement(doc, bigCircleElementId, Line.CreateBound(XYZ.Zero, crossProduct), angle);
« Последнее редактирование: 09-01-2022, 18:10:25 от bronx »

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Неплохо было бы проверить, а ну как твои круги уже в одной плоскости или параллельных лежат (crossProduct.IsAlmostEqualTo(XYZ.Zero))
Неправильная ось поворота. Тут вообще говоря, возможны 2 способа:

1) Способ посложнее, но зато позволяет решить задачу за один поворот. Описываешь обе плоскости в каноническом виде Ax+By+Cz + D = 0, решаешь систему уравнений - получаешь уравнение прямой, выбираешь произвольную точку на ней

2) Способ попроще, возьми центр круга, который хочешь повернуть, но тогда дополнительно к Rotate ещё нужен Move, чтобы переместить в одну плоскость


В любом случае, нужно переделать создание оси поворота. Для этой оси можно задать unbound:
Код - C# [Выбрать]
  1. Line.CreateUnbound(origin, crossProduct.Normalize())

Для первого способа origin будет найденная точка, для второго, соответственно, центр круга