Внутреннее сопряжение прямой и окружности

Автор Тема: Внутреннее сопряжение прямой и окружности  (Прочитано 5842 раз)

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

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

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

  • ADN OPEN
  • Сообщений: 24
  • Карма: 1
Добрый вечер! Нужна помощь в построении сопряжения прямой и окружности.
На данный момент удалось найти две точки - начальную и конечную.
Так же известен радиус дуги сопряжения и точка центра сопряжения.
Но вот не могу построить саму дугу.
Подскажите возможно ли как то построить дугу по этим данным?
Вот что получается на данный момент:



Но надо что бы вышло вот так -




Вот такой у меня код -
Код - C# [Выбрать]
  1.   Vector3d norm = Vector3d.ZAxis;
  2.                                 CircularArc3d a1 = new CircularArc3d(FirstFilletPpoint, norm, radius);
  3.                                 CircularArc3d a2 = new CircularArc3d(SecondFilletPoint, norm, radius);
  4.                                 CurveCurveIntersector3d cint = new CurveCurveIntersector3d(a1, a2, norm);
  5.                                 if (cint.NumberOfIntersectionPoints == 2)
  6.                                 {
  7.                                     Point3d pc1 = cint.GetIntersectionPoint(0);
  8.                                     Point3d pc2 = cint.GetIntersectionPoint(1);
  9.                                     CircularArc3d arc31 = new CircularArc3d(FirstFilletPpoint, pc1, SecondFilletPoint);
  10.                                     CircularArc3d arc32 = new CircularArc3d(FirstFilletPpoint, pc2, SecondFilletPoint);
  11.  
  12.  
  13.                                     Arc arc1 = circArc3Arc(arc31);
  14.                                     Arc arc2 = circArc3Arc(arc32);
  15.  
  16.                                    if (arc1.StartPoint.DistanceTo(FirstFilletPpoint) < arc2.StartPoint.DistanceTo(FirstFilletPpoint))
  17.                                    {
  18.                                         blockTableRecord.AppendEntity(arc1);
  19.                                         tr.AddNewlyCreatedDBObject(arc1, true);
  20.                                    }
  21.  
  22.                                    else
  23.                                     {
  24.                                         blockTableRecord.AppendEntity(arc2);
  25.                                         tr.AddNewlyCreatedDBObject(arc2, true);
  26.                                     }
  27.  
  28. ----------------------------------------------------------------
  29.  private Arc circArc3Arc(CircularArc3d circArc)
  30.         {
  31.            Point3d center = circArc.Center;
  32.            Vector3d normal = circArc.Normal;
  33.             Vector3d refVec = circArc.ReferenceVector;
  34.            Plane plane = new Plane(center, normal);
  35.             double ang = refVec.AngleOnPlane(plane);
  36.             return new Arc(
  37.               center,
  38.               normal,
  39.               circArc.Radius,
  40.               circArc.StartAngle + ang,
  41.               circArc.EndAngle + ang
  42.             );
  43.         }
  44.  

Спасибо за любую помощь!
« Последнее редактирование: 28-11-2017, 20:33:41 от Александр Ривилис »

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 805
  • Карма: 166
    • Мои плагины к Автокаду
Наконец-то вы суда мигрировали. Приветствую! Мои предложения я в личку вам кинул

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

  • ADN OPEN
  • Сообщений: 24
  • Карма: 1
Да сюда тоже написать решил. Спасибо Вам, сейчас пытаюсь применить Ваш код.

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

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

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

  • ADN OPEN
  • Сообщений: 24
  • Карма: 1
Ок, понял Вас, прошу прощения.

Отмечено как Решение OlegSysa 29-11-2017, 19:48:25

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
На данный момент удалось найти две точки - начальную и конечную.
Так же известен радиус дуги сопряжения и точка центра сопряжения.
Тут уже излишняя информация. Если есть две точки и центр, то радиус уже не нужен. Фактически тебе нужно найти еще одну точку на дуге, чтобы построить дугу по трём точкам. Это просто. Соединяешь начальную и конечную точки дуги отрезком и находишь его середину (p12).
Из точки центра дуги в точку p12 откладываешь отрезок длиной в радиус - вот это и будет твоя третья точка. Дальше используешь конструктор
Код - C# [Выбрать]
  1. public CircularArc3d(
  2.     Point3d startPoint,
  3.     Point3d pointOnArc,
  4.     Point3d endPoint
  5. );
  6.  
Ну а дальше используя функцию circArc3Arc преобразуешь CircularArc3d в Arc. Вот и всё.
Есть даже готовый исходник: http://adn-cis.org/forum/index.php?topic=964.msg4223#msg4223  - там смотришь метод TestArc1
« Последнее редактирование: 28-11-2017, 23:59:30 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Мои предложения я в личку вам кинул
А с каких пор предложения по реализации вопроса на форуме скидываются в личку??? О_о

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

  • ADN OPEN
  • Сообщений: 24
  • Карма: 1
Мои предложения я в личку вам кинул
А с каких пор предложения по реализации вопроса на форуме скидываются в личку??? О_о
Это было на другом ресурсе

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

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

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

  • ADN OPEN
  • Сообщений: 24
  • Карма: 1
Пытаюсь. Я провел линию, нашел центр. Не могу понять как мне провести линию конкретной длины(радиус) через две точки.  До этого я делал так:
 
Код - C# [Выбрать]
  1. Line lineRadius = new Line(acadcircle.Center, interfacingPoint);
  2.                                 Vector3d ext = lineRadius.Delta / 2;
  3.                                 lineRadius.Extend(false, lineRadius.EndPoint + ext);

То есть изначально я создавал линию по двум точкам а потом продлевал ее.
Существуют ли более изящные способы создать линию?

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

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

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

  • ADN OPEN
  • Сообщений: 24
  • Карма: 1
Все, делаю, прошу прощения,я тот код не посмотрел сразу! Пытался сам сделать.

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

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

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

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

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

  • ADN OPEN
  • Сообщений: 24
  • Карма: 1
Отлично, получилось! Спасибо огромное! ;D :) :D





Еще вопрос такой:
Возможно ли как то повторить(скопировать) только немного с другими размерами эту всю верхнюю дугу? Или снова надо чертить программно всю эту конструкцию линия за линией? Либо как вариант обернуть этот код в метод с параметрами и вызвать повторно(пока писал это предложение - понял что это наверно лучшее решение =)  ?