Создать текст перпендикулярно полилинии

Автор Тема: Создать текст перпендикулярно полилинии  (Прочитано 9772 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
Здравствуйте! Не могу разобраться как создавать текст под определенным углом. У меня есть полилиния, на которой я в определенных точках строю перпендикуляры, и выполняю прочие действия. Мне нужно в этих точках создавать текст, который будет расположен параллельно этим перпендикулярам. C#

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Его можно создавать горизонтальным и поворачивать на нужный угол

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

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
Его можно создавать горизонтальным и поворачивать на нужный угол
спасибо. Хотелось знать из чего можно извлечь этот угол. На данный момент мне приходится ради этого строить линию, перпендикулярную полилинии, и извлекать угол из нее.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
На данный момент мне приходится ради этого строить линию, перпендикулярную полилинии
А линию как-то же строите? По каким данным?

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

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
Цитировать
А линию как-то же строите? По каким данным?
Код - C# [Выбрать]
  1. Vector3d tangentVector = acPoly.GetFirstDerivative(acPoly.GetPointAtDist(i));
  2.                             Vector3d perpendicularVector = tangentVector.GetPerpendicularVector();
  3.                             perpendicularVector = perpendicularVector.GetNormal();
  4.                             Point3d startPoint = acPoly.GetPointAtDist(i) + perpendicularVector *10;
  5.                             Point3d endPoint = acPoly.GetPointAtDist(i) - perpendicularVector * 10;
с помощью вектора, беру две точки, соединяю линией. У вектора не знаю как угол взять

Отмечено как Решение Zombiy 08-04-2016, 17:16:56

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Можно так:
Код - C# [Выбрать]
  1. Vector3d vec = new Vector3d(1.0, 2.0, 0.0);
  2. double angle = vec.GetAngleTo(Vector3d.XAxis);

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
У вектора не знаю как угол взять
Например так:
Код - C# [Выбрать]
  1. double ang = Vector3d.XAxis.GetAngleTo(perpendicularVector, Vector3d.ZAxis);

Код исправлен.
« Последнее редактирование: 08-04-2016, 18:57:34 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 20
  • Карма: 0
Спасибо! то что надо!

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Код - C# [Выбрать]
  1. double ang = perpendicularVector.GetAngleTo(Vector3d.XAxis, Vector3d.ZAxis);
Да, такой вариант более правильный. Учитывает, что вектора могут быть трехмерными. Я даже не знал о такой перегрузке метода :)

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Да, такой вариант более правильный. Учитывает, что вектора могут быть трехмерными. Я даже не знал о такой перегрузке метода :)
Тут важнее другое: в моём варианте угол в пределах [0, 2 x Pi]. А в твоём варианте в пределах [0, Pi]
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Я же не поленился и проверил :)
Да, мой вариант не возвращает углы больше 180 градусов.
Странно, но эти два варианта разные значения возвращают в тех случаях, когда должны возвращать одинаковые, по идее. Такое ощущение, что в Вашем варианте угол измеряется по часовой стрелке (по правилу левой руки). Особенность?
Извините, вам запрещён просмотр содержимого спойлеров.

Извините, вам запрещён просмотр содержимого спойлеров.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
В моём случае правильнее будет так
Код - C# [Выбрать]
  1. double ang = Vector3d.XAxis.GetAngleTo(perpendicularVector, Vector3d.ZAxis);
т.е. на какой угол нужно повернуть ось X по правилу правой руки, чтобы получить вектор perpendicularVector.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
т.е. на какой угол нужно повернуть ось X по правилу правой руки, чтобы получить вектор perpendicularVector
Понятно. Да, вполне логично. Проверил - работает как надо!