Тема: Дуга по точкам как из панели инструментов

Добрый день всем!
Вопрос такой.
Как можно программно заставить рисовать дугу по 3-м точкам, как это делается из панели инструментов? Координаты точек известы, очерёдность (какая из них первая, какая вторая...) тоже. Есть функция AddArc, рисующая дугу, но её список параметров впечатляет. :) Очень не хочется их все высчитывать из этих 3-х точек.
Ещё я знаю, что есть такая штука, как SendCommand. Только вот что ему надо send-ить в моём случае, я чего-то не догоняю...
И напоследок. Вообще-то, мне нужен дуговой сегмент полилинии, я его даже сделала, но он какой-то не очень дуговой получился. :) В смысле, дуга, нарисованная руками в AutoCAD-e по тем же точкам не совпадает с полученным сегментом. Очень вряд ли я могла ошибиться в формулах, проверяла несколько раз. В общем, на полилинию я решила временно забить, а попробовать нарисовать дугу. Не хочется думать на ошибки округления, ибо сам AutoCAD ведь как-то справляется с рисованием дуг по точкам. Значит, он это умеет... Значит, глюк у мення.
Спасибо огромное всем, кто что-нибудь подскажет.

Re: Дуга по точкам как из панели инструментов

> masha
Для начала посмотри на вычисление тангенса по трем точкам:
https://www.caduser.ru/forum/topic22044.html
самая последняя программа - решает твою задачу с полилиниями в динамике...
Если останутся вопросы - спрашивай, попробуем помочь.

Re: Дуга по точкам как из панели инструментов

Спасиобо за ссылочку, но к сожалению, в Лиспе я ничего не понимаю. :(( Однако, как следует из русских надписей в коде (видимо, это сообщения для юзера), там чего-то надо выбирать на экране. В моём случае координаты высчитываются в программе. Если бы я знала Лисп, то, наверно, смогла бы модифицировать этот кусок под свои нужды... В общем, буду благодарна, если расскажете, что делать с Вашей программочкой дальше. Было бы очень здорово, если бы по 3-м точкам вычилялся правильный тангенс, а дальше я сделаю SetBulge -- и ура.  Я уже паталась на VBA этот тангенс вычилять, не могу пока найти ошибку. Как говорится, "похожа свинья на ёжа, только иголки не те" :)

Re: Дуга по точкам как из панели инструментов

Допустим есть три точки:
p1 - начальная
p2 - между началом и концом сегмента
p3 - конец сегмента
Чтобы узнать тангенс - нужно узнать угол...
Для начала узнаем угол между  p2 и p3
потом между   p1 p2 и узнаем разницу...
((angle p2 p3) - (angle p1 p2))
Эта разница равна сумме углов треугольника в вершинах p1 и p3
Если вспомнить геометрию, то этот угол в два раза больше угла дуги, если измерять из центра.
Т.е. его нужно разделить пополам и найти тангенс!
Общая формула нахождения угла будет выглядеть:
((angle p2 p3) - (angle p1 p2)) / 2
Тангенс можно найти разделив синус на косинус, т.е. если угол равен A
То тангенс четверти угла равен:
(sin A) / (cos A)
На лиспе это выглядит:

((lambda (a)
   (/ (sin a) (cos a))
  ) ;_  lambda
  (/ (- (angle p2 p3) (angle p1 p2)) 2.)
 )

Re: Дуга по точкам как из панели инструментов

> masha
По поводу ссылочки...
Если загрузить эту программу в автокад, то программа просит угазать полилинию и динамически изменяет кривизну сегмента, в который ткнешь при выборе...
Указать можно линейный сегмент, он сразу превратится в дуговой и будет изменять кривизну, вслед за курсором.

Re: Дуга по точкам как из панели инструментов

Не выходит каменный цветок... (с)... Правда, я угол, опирающийся на дугу (р1,р3), искала через угол при вершине р2 треугольника по теореме косинусов, но это, вроде, не должно отразиться на результате.
Не очень понятно, почему тангенс четверти угла вы предлагаете считать как sin A / cos A, почему не А/4?
В любом случае, нарисованное нечто визуально похоже на дугу, но не совпадает с дугой, которую можно нарисовать из панели инструментов по 3-м точкам.
Вот код:
здесь р1=A, p2=D, p3=C, если переходить к Вашим обозначениям. fi - центральный угол дуги АС.
    cos_D = (R_AD * R_AD + R_DC * R_DC - R_AC * R_AC) / 2 / R_AD / R_DC
    R = R_AC / Sqr(2 * (1 + cos_D))
    cos_fi = 2 * cos_D * cos_D - 1
    sin_fi = Sqr(1 - cos_fi * cos_fi)
    tg_fi = sin_fi / cos_fi
    fi = Atn(tg_fi)
    arc_angle = fi / 2
    tg_betta = Tan(arc_angle / 4)

Re: Дуга по точкам как из панели инструментов

> masha

cos_d = Cos(D) ' Штатная функция VBA
cos_fi=2*cos_d^2-1 ' возвредение в степень
tg_fi = tan(fi) ' Штатная функция VBA, угол - в радианах

Это в качестве предложения :)

Re: Дуга по точкам как из панели инструментов

Чтобы считать сos(D) или tg(fi), надо знасть D или fi соответственно. Я правлильно понимаю?... У меня есть только 3 точки, по которым я нахожу разные функции углов. Чтобы найти сам угол, использую Atn, т.к. других аналогичниых функций либо нет, либо я не нашла. Чтобы искать арктангенс, нужен тангенс. Его я получаю через sin и cos.
Меня сейчас больше результат, а не способ его получения.
Насчёт возведения в степень -- если я правлильно помню, то эта операция выполняется гораздо дольше, чем умножение.

Re: Дуга по точкам как из панели инструментов

Если совсем по-тупому, то:

Sub CreateArcByCmd()
Dim pt0(2) As Double, pt1(2) As Double, pt2(2) As Double
Dim SysVarOsmode
  SysVarOsmode = ThisDrawing.GetVariable("osmode")
  ThisDrawing.SetVariable "osmode", 0
  pt0(0) = 0#: pt0(1) = 0#: pt0(2) = 0#
  pt1(0) = 10#: pt1(1) = 10#: pt1(2) = 0#
  pt2(0) = 20#: pt2(1) = 0#: pt2(2) = 0#
  ThisDrawing.SendCommand "_.arc " & _
    CStr(pt0(0)) & "," & CStr(pt0(1)) & _
    vbCr & _
    CStr(pt1(0)) & "," & CStr(pt1(1)) & _
    vbCr & _
    CStr(pt2(0)) & "," & CStr(pt2(1)) & _
    vbCr
  ThisDrawing.SetVariable "osmode", SysVarOsmode
End Sub

Трехмерные точки - по привычке сначала сделал, потом оставил по зрелому размышлению.

Re: Дуга по точкам как из панели инструментов

Не работает. Зато после выхода из макроса AutoCAD начинает просить задать 3 точки для дуги.
В Debuger-e проходила -- вроде, выполняет, но на экране при этом ничего не происходит.

Re: Дуга по точкам как из панели инструментов

Хорошо. При ручном выполнении с ком.строки команда _arc у меня выдает следующее:

Command: _arc Specify start point of arc or [Center]:
Specify second point of arc or [Center/End]:
Specify end point of arc:

А у тебя что?

Re: Дуга по точкам как из панели инструментов

Это же самое выдаёт. Только мне надо, чтобы эти все точки определялись в программе, чтобы бедный юзер никуда не тыкал своей трясущейся рукой...

Re: Дуга по точкам как из панели инструментов

А вот это заменить на свои значения?

  pt0(0) = 0#: pt0(1) = 0#: pt0(2) = 0#
  pt1(0) = 10#: pt1(1) = 10#: pt1(2) = 0#
  pt2(0) = 20#: pt2(1) = 0#: pt2(2) = 0#

Re: Дуга по точкам как из панели инструментов

Вот, заменила:
pt0(0) = cell_points_arr(0): pt0(1) = cell_points_arr(1): pt0(2) = cell_points_arr(2)
  pt1(0) = cell_points_arr(3): pt1(1) = cell_points_arr(4): pt1(2) = cell_points_arr(5)
  pt2(0) = cell_points_arr(6): pt2(1) = cell_points_arr(7): pt2(2) = cell_points_arr(8)
И после этого AutoCAD просит указать точки вручную

Re: Дуга по точкам как из панели инструментов

А массив-то заполнен? Что будет, если для начала жестко задать точки?

Re: Дуга по точкам как из панели инструментов

Если верить Debuger-y, то и массив заполнен, и даже сами точки pt0, pt1, pt2.  А у вас все рисуется как надо, не просит ткнуть пальцем?

Re: Дуга по точкам как из панели инструментов

Не просит. btw, ко мне - на "ты", я все ж один как ни крути.
Вот еще возможный проблем: точки не лежат на одной прямой часом? И еще один момент - если точки находятся на слишком близком расстоянии друг от друга, кад может их воспринимать как одну.

Re: Дуга по точкам как из панели инструментов

Точки не лежат на прямой, все разные. И не близко. Проверяла.
Насчёт "вы" -- хорошо, не буду. :) Однако, обращение на ВЫ порой удерживает от категоричных высказываений. Например, сказать "ну ты блин дебил!" можно, а "ну вы блин дебил" -- как-то язык не поворачивается. :) Поэтому с малознакомыми людьми я предпочитаю общаться на "вы", если не высказано других предпочтений.

Re: Дуга по точкам как из панели инструментов

> masha
Вот так работает:

strPt1 = Replace(CStr(pickPt1(0)), ",", ".") & "," & Replace(CStr(pickPt1(1)), ",", ".")
strPt2 = Replace(CStr(pickPt2(0)), ",", ".") & "," & Replace(CStr(pickPt2(1)), ",", ".")
strPt3 = Replace(CStr(pickPt3(0)), ",", ".") & "," & Replace(CStr(pickPt3(1)), ",", ".")
      ThisDrawing.SendCommand ("_arc" & vbCr & strPt1 & vbCr & strPt2 & vbCr & strPt3 & vbCr)

~'J'~

Re: Дуга по точкам как из панели инструментов

По поводу математики - нахождение тангенса по трем точкам...
я НЕНАВИЖУ VBA - сделал только для вас!

Sub Mysub()
Dim pt1 As Variant
pt1 = ThisDrawing.Utility.GetPoint(, "Укажите первую точку ")
Dim pt2 As Variant
pt2 = ThisDrawing.Utility.GetPoint(, "Укажите вторую точку ")
Dim pt3 As Variant
pt3 = ThisDrawing.Utility.GetPoint(, "Укажите третью точку ")
Dim Angle_1 As Double
Angle_1 = ThisDrawing.Utility.AngleFromXAxis(pt2, pt3)
Dim Angle_2 As Double
Angle_2 = ThisDrawing.Utility.AngleFromXAxis(pt1, pt2)
Dim Angle_ As Double
Angle_ = (Angle_1 - Angle_2) / 2
Dim tg_fi As Double
tg_fi = Sin(Angle_) / Cos(Angle_)
MsgBox "Тангенс дугового сегмента равен " & tg_fi, , ""
End Sub

Этот код находит тангенс по трем точкам, знак у тангенса правильный для построения полилинии. Условие только одно - первая точка - начало будущего сегмента, третья точка - конец сегмента, вторая точка между ними - в любом месте сегмента...

Re: Дуга по точкам как из панели инструментов

Насчёт дуг и SendCommand - cпасибо всем большое!!! Оно работает!!!! Ура!!!!
Евгений Елпанов, ваш фрагмент рисует полилинию с дугообразными сегментами, но не с дуговыми. Дуга, нарисованная вручную по тем же трём точкам, не совпадает с дугой, которая рисуется вашим фрагментом. У меня было примерно то же самое, когда я сама высчитывала тангенс. Пусть другим способом, но результат примерно одинаково непохожий на дугу.
Однако, всё равно большое спасибо за поддержку! Прорвёмся!!!

Re: Дуга по точкам как из панели инструментов

> masha
Прикольно у вас получается...
Попробуйте нарисовать полилинию с дуговыми сегментами, в качестве точек указать точки на одном из сегментов и сравнить полученный тангенс с реальным тангенсом у полилинии!
Наверняка они будут равны...

Re: Дуга по точкам как из панели инструментов

> masha
Кстати, а вы пользуетесь привязками, при указании точек?

Re: Дуга по точкам как из панели инструментов

Привязками пользуюсь. Чего-то не получается у меняполилинию построить с дуговыми сегментами: она просит только 2 точку, а кривизну задаёт свою от балды. Покопаюсь сейчас с настройками...

Re: Дуга по точкам как из панели инструментов

> masha
Создай полилинию, а потом воткни в нужный сегмент кривизну...