Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: OlegSysa от 28-11-2017, 18:54:15

Название: Внутреннее сопряжение прямой и окружности
Отправлено: OlegSysa от 28-11-2017, 18:54:15
Добрый вечер! Нужна помощь в построении сопряжения прямой и окружности.
На данный момент удалось найти две точки - начальную и конечную.
Так же известен радиус дуги сопряжения и точка центра сопряжения.
Но вот не могу построить саму дугу.
Подскажите возможно ли как то построить дугу по этим данным?
Вот что получается на данный момент:

(https://s2.postimg.org/wcar9nwth/1111.jpg) (https://postimg.org/image/wcar9nwth/)

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


(https://s2.postimg.org/j856x24sl/222.jpg) (https://postimg.org/image/j856x24sl/)

Вот такой у меня код -
Код - 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.  

Спасибо за любую помощь!
Название: Re: Внутреннее сопряжение прямой и окружности
Отправлено: avc от 28-11-2017, 19:02:42
Наконец-то вы суда мигрировали. Приветствую! Мои предложения я в личку вам кинул
Название: Re: Внутреннее сопряжение прямой и окружности
Отправлено: OlegSysa от 28-11-2017, 19:13:26
Да сюда тоже написать решил. Спасибо Вам, сейчас пытаюсь применить Ваш код.
Название: Re: Внутреннее сопряжение прямой и окружности
Отправлено: Александр Ривилис от 28-11-2017, 20:35:08
OlegSysa
Приветствую на форуме. Прочитай у меня в подписи о правиле форматирования кода и в дальнейшем соблюдай его.
Также обрати внимание на табуляцию в коде и выкладывай целые функции, а не обрывки.
Название: Re: Внутреннее сопряжение прямой и окружности
Отправлено: OlegSysa от 28-11-2017, 20:44:19
Ок, понял Вас, прошу прощения.
Название: Re: Внутреннее сопряжение прямой и окружности
Отправлено: Александр Ривилис от 28-11-2017, 20:58:59
На данный момент удалось найти две точки - начальную и конечную.
Так же известен радиус дуги сопряжения и точка центра сопряжения.
Тут уже излишняя информация. Если есть две точки и центр, то радиус уже не нужен. Фактически тебе нужно найти еще одну точку на дуге, чтобы построить дугу по трём точкам. Это просто. Соединяешь начальную и конечную точки дуги отрезком и находишь его середину (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
Название: Re: Внутреннее сопряжение прямой и окружности
Отправлено: Александр Пекшев aka Modis от 29-11-2017, 14:08:35
Мои предложения я в личку вам кинул
А с каких пор предложения по реализации вопроса на форуме скидываются в личку??? О_о
Название: Re: Внутреннее сопряжение прямой и окружности
Отправлено: OlegSysa от 29-11-2017, 17:02:10
Мои предложения я в личку вам кинул
А с каких пор предложения по реализации вопроса на форуме скидываются в личку??? О_о
Это было на другом ресурсе
Название: Re: Внутреннее сопряжение прямой и окружности
Отправлено: Александр Ривилис от 29-11-2017, 17:03:06
OlegSysa
Попробовал моё предложение?
Название: Re: Внутреннее сопряжение прямой и окружности
Отправлено: OlegSysa от 29-11-2017, 17:52:23
Пытаюсь. Я провел линию, нашел центр. Не могу понять как мне провести линию конкретной длины(радиус) через две точки.  До этого я делал так:
 
Код - C# [Выбрать]
  1. Line lineRadius = new Line(acadcircle.Center, interfacingPoint);
  2.                                 Vector3d ext = lineRadius.Delta / 2;
  3.                                 lineRadius.Extend(false, lineRadius.EndPoint + ext);

То есть изначально я создавал линию по двум точкам а потом продлевал ее.
Существуют ли более изящные способы создать линию?
Название: Re: Внутреннее сопряжение прямой и окружности
Отправлено: Александр Ривилис от 29-11-2017, 18:01:24
Ааааа! Ну я же дал готовый код!!!!!
Название: Re: Внутреннее сопряжение прямой и окружности
Отправлено: OlegSysa от 29-11-2017, 18:09:50
Все, делаю, прошу прощения,я тот код не посмотрел сразу! Пытался сам сделать.
Название: Re: Внутреннее сопряжение прямой и окружности
Отправлено: Александр Ривилис от 29-11-2017, 18:13:00
То есть изначально я создавал линию по двум точкам а потом продлевал ее.
Существуют ли более изящные способы создать линию?
Конечно. Сразу посчитать правильно обе точки.
Название: Re: Внутреннее сопряжение прямой и окружности
Отправлено: Александр Ривилис от 29-11-2017, 18:15:02
Все, делаю, прошу прощения,я тот код не посмотрел сразу! Пытался сам сделать.
Пытаться сделать самостоятельно - это похвально. Но если ты приходишь на форум и задаёшь вопросы, то не забывай читать ответы и как-то на них реагировать.  ;)
Название: Re: Внутреннее сопряжение прямой и окружности
Отправлено: OlegSysa от 29-11-2017, 18:40:47
Отлично, получилось! Спасибо огромное! ;D :) :D



(https://s2.postimg.org/6ho550vcl/555.jpg) (https://postimg.org/image/6ho550vcl/)

Еще вопрос такой:
Возможно ли как то повторить(скопировать) только немного с другими размерами эту всю верхнюю дугу? Или снова надо чертить программно всю эту конструкцию линия за линией? Либо как вариант обернуть этот код в метод с параметрами и вызвать повторно(пока писал это предложение - понял что это наверно лучшее решение =)  ?
Название: Re: Внутреннее сопряжение прямой и окружности
Отправлено: Александр Ривилис от 29-11-2017, 19:40:33
Еще вопрос такой:
У нас на форуме принято правило "Один вопрос - одна тема!".
Либо как вариант обернуть этот код в метод с параметрами и вызвать повторно(пока писал это предложение - понял что это наверно лучшее решение =)  ?
Угу!
Название: Re: Внутреннее сопряжение прямой и окружности
Отправлено: OlegSysa от 29-11-2017, 19:49:00
У нас на форуме принято правило "Один вопрос - одна тема!"
Ок, понял, спасибо большое Вам!
Название: Re: Внутреннее сопряжение прямой и окружности
Отправлено: Debalance от 30-11-2017, 16:13:49
А с каких пор предложения по реализации вопроса на форуме скидываются в личку??? О_о
Объяснений просматривается два:
1. Код содержит приватную информацию.
2. Код слишком громоздок (долго прокручивать скроллбар).