Как построить касательную к окружности?
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как построить касательную к окружности?

Как построить касательную к окружности?

Ответ
Поиск в этой теме
Непрочитано 26.12.2019, 15:23 #1
Как построить касательную к окружности?
prajdziswet
 
Регистрация: 30.03.2015
Сообщений: 153

Как программно построить касательную к окружности, допустим знаем точку и имя окружности?
п.с высчитывать координаты не хочется,точку на окружности
Код:
[Выделить все]
 
(setq x1 (getpoint))
(setq s1 (ssname (ssget) 0))
Заранее благодарю.
Просмотров: 6002
 
Непрочитано 27.12.2019, 08:33
#2
Vladimir_Sergeevich

рисую дороги, в перерывах курю Lisp
 
Регистрация: 20.04.2011
Пермь
Сообщений: 475
<phrase 1= Отправить сообщение для Vladimir_Sergeevich с помощью Skype™


Если знаешь точку на окружности смотри функции (vlax-curve-getParamAtPoint <vla-obj> <point>) и (vlax-curve-getFirstDeriv <vla-obj> <param>).
ну и по полученному значению производной вычисляй угол наклона своей касательной
__________________
Не труд сделал из обезьяны человека, а лень и жажда халявы...
Vladimir_Sergeevich вне форума  
 
Автор темы   Непрочитано 27.12.2019, 10:40
#3
prajdziswet


 
Регистрация: 30.03.2015
Сообщений: 153


как раз то и не знаю точку на окружности и хочу найти, но не высчитывая=>
Хочу чтобы автокад сам вычислил или построил касательную от произвольной точки к окружности(точнее там две касательные, если конечно точка не внутри окружности или ее грани)

Последний раз редактировалось prajdziswet, 27.12.2019 в 11:07.
prajdziswet вне форума  
 
Непрочитано 27.12.2019, 11:00
#4
Alex.gomel


 
Регистрация: 09.11.2017
Сообщений: 28


Координаты точек на окружности нужны в любом случае. А вот искать их можно по-разному. Самый простой вариант - построить вспомогательную окружность, ее центр - середина между заданной (произвольной) точкой и центром исходной окружности, радиус - расстояние до заданной (произвольной) точки. Через точки пересечения вспомогательной окружности и исходной пройдут касательные. Кода 5 строчек...
Alex.gomel вне форума  
 
Непрочитано 27.12.2019, 11:18
1 | 1 #5
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


Цитата:
Сообщение от prajdziswet Посмотреть сообщение
чтобы автокад сам вычислил или построил касательную
Код:
[Выделить все]
 (command "_line" (getpoint "\nТочка касательной: ") "_tan" (cadr (entsel "\nОкружность: ")) "")
koMon вне форума  
 
Автор темы   Непрочитано 27.12.2019, 11:45
#6
prajdziswet


 
Регистрация: 30.03.2015
Сообщений: 153


Код:
[Выделить все]
 (cadr (entsel "\nОкружность: "))
- а вот это интересно , остальное я знал, но не знал как подсунуть команде "line". Пробывал "_tan" и имя окружности, но не получалось.

Буду пробывать а точку попробую подсунуть верхнию-нижнию, боковую (квадранта).

Большое спасибо, чуть позже отпишусь - вроде должно работать (вопрос как оно воспримет список вместо ensel)...
prajdziswet вне форума  
 
Непрочитано 27.12.2019, 12:01
#7
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


Цитата:
Сообщение от prajdziswet Посмотреть сообщение
как оно воспримет список
никак, нужно кормить ему имена примитивов
koMon вне форума  
 
Автор темы   Непрочитано 27.12.2019, 12:12
#8
prajdziswet


 
Регистрация: 30.03.2015
Сообщений: 153


я и хочу попробывать скормить список из имени окружности и точки - вместо ensel

----- добавлено через ~33 мин. -----
Код:
[Выделить все]
 (setq  (getpoint))
(setq s1 (ssname (ssget) 0))
(setq ss1 (list (+ (cadr (assoc 10 (entget s1))) (cdr (assoc 40 (entget s1)))) (cadr (assoc 10 (entget s1)))))
(command "_line" x1 "_tan" (cadr (cons s1 (list ss1))) "")
вроде работает. понятное дело без проверки, чтобы нужный квадрант подсовывало

а как если надо середину подсунуть "_mid" в линию, какой список (имя точка имя точка), или просто две точки?

Последний раз редактировалось prajdziswet, 27.12.2019 в 12:50.
prajdziswet вне форума  
 
Непрочитано 27.12.2019, 13:44
#9
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


это уже вычисления
Код:
[Выделить все]
 (setq circle (ssname (ssget) 0))
(setq point (getpoint "\nТочка касательной: "))
(command "_line" point "_tan" (polar (cdr (assoc 10 (entget circle))) (- (angle point (cdr (assoc 10 (entget circle)))) (* 0.5 pi)) (cdr (assoc 40 (entget circle))))  "")
(command "_line" point "_tan" (polar (cdr (assoc 10 (entget circle))) (+ (angle point (cdr (assoc 10 (entget circle)))) (* 0.5 pi)) (cdr (assoc 40 (entget circle))))  "")
Цитата:
Сообщение от prajdziswet Посмотреть сообщение
а как если надо середину подсунуть "_mid" в линию, какой список (имя точка имя точка), или просто две точки?
да также как и с окружностью

Цитата:
Сообщение от prajdziswet Посмотреть сообщение
нужный квадрант подсовывало
а какой критерий нужности квадранта?
koMon вне форума  
 
Автор темы   Непрочитано 27.12.2019, 15:28
#10
prajdziswet


 
Регистрация: 30.03.2015
Сообщений: 153


koMon - Спасибо, за подсказку!
Цитата:
Сообщение от koMon Посмотреть сообщение
а какой критерий нужности квадранта?
это уже тебе решать. у меня это уравнение прямой, когда мне надо я строю с двух сторон касательную, когда надо с одной...
п.с не совсем понятно
Цитата:
Сообщение от koMon Посмотреть сообщение
это уже вычисления
- нет это скорее проверка подсовывания (чуть преобразовал твое выражение - по сути особо не менял), что работает. а если надо получить координаты -так это просто получаем последний примитив (это линия) и их неё получаем вторую точку
___________________
Большое спасибо. Что я хотел -ты ответил -спасибо.
prajdziswet вне форума  
 
Автор темы   Непрочитано 30.12.2019, 13:02
#11
prajdziswet


 
Регистрация: 30.03.2015
Сообщений: 153


единственное с чем столкнулся:при первом запуске автокада, а потом скрипта не хочет выполнять команду line - прерывается...
prajdziswet вне форума  
 
Непрочитано 30.12.2019, 15:24
#12
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


а что пишет когда прерывается?
koMon вне форума  
 
Непрочитано 30.12.2019, 18:24
#13
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


А привязки случайно не срабатывают?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 30.12.2019, 18:34
#14
Регистр


 
Регистрация: 04.07.2009
Подмосковье
Сообщений: 1,516
Отправить сообщение для Регистр с помощью Skype™


Прочертить радиус. Затем перпендикуляр к радиусу. Полученый перпендикулр перенести к концу радиуса. И все проблемы без формул, теорем и прочей мудрёности.
__________________
Сам по себе
Регистр вне форума  
 
Непрочитано 30.12.2019, 19:42
#15
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Цитата:
Сообщение от Регистр Посмотреть сообщение
Прочертить радиус. Затем перпендикуляр к радиусу. Полученый перпендикулр перенести к концу радиуса. И все проблемы без формул, теорем и прочей мудрёности.
Или включить мозг, вспомнить геометрию и тригонометрию и решить задачку
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.01.2020, 08:24
#16
prajdziswet


 
Регистрация: 30.03.2015
Сообщений: 153


1)
Цитата:
Сообщение от koMon Посмотреть сообщение
а что пишет когда прерывается?
= ничего не пишет. Точнее второй конец линии просто зависает в воздухе, как будто не привязалось. одна точна стоит линии -вторая, называется привязывайся сам.
(раза два-три запустишь программу потом без проблем чертит)
2)
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
А привязки случайно не срабатывают?
Нет. На это - я так и подумал самым первым делом. Да и почему только при первом разе, потом как раза два прочертил, оно без проблем чертит.
3)
Цитата:
Сообщение от Регистр Посмотреть сообщение
Прочертить радиус. Затем перпендикуляр к радиусу
- гениально (извиняюсь, но это полный бред! как прочертить радиус круга - по кругу?)..или я что-то не догоняю...
4)
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Или включить мозг, вспомнить геометрию и тригонометрию и решить задачку
= Наверное так и придется, потому что совершенно не понятно, почему оно потом работает нормально? Но "мозг" - существо довольно ленивое, хотелось проще. Просто или кубическое уравнение получается или квадратичное, можно и геометрически решить: но очень много углов, да и продумать как оно в каждой четверти будет вести (будет также все отниматься-слаживаться)
п.с ВСЕХ с наступившим новым годом!!!
tmp.lsp - пытался комментировать, но все равно не дорисовывает первые пару раз..
наверное придется решать так - и проставлять просто точкой....

Последний раз редактировалось prajdziswet, 03.01.2020 в 08:43.
prajdziswet вне форума  
 
Непрочитано 03.01.2020, 11:17
#17
Регистр


 
Регистрация: 04.07.2009
Подмосковье
Сообщений: 1,516
Отправить сообщение для Регистр с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Или включить мозг, вспомнить геометрию и тригонометрию и решить задачку
Вы хоть и модератор, но ХАМИТЬ, не надо, соблюдайте этикет сударь.. Я высказал свое мнение, как прочертить касательную к окружности без математичесих вычислений.
Вложения
Тип файла: pdf Касательная.pdf (27.8 Кб, 29 просмотров)
__________________
Сам по себе

Последний раз редактировалось Регистр, 03.01.2020 в 11:23.
Регистр вне форума  
 
Непрочитано 03.01.2020, 11:56
#18
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Регистр, а если внимательно прочитать условия задачи: построить касательную из указанной точки. Программно, используя LISP. Расписанное построение касательной имеет такую же ценность, как и описание построения отрезка "от балды".
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.01.2020, 12:14
#19
prajdziswet


 
Регистрация: 30.03.2015
Сообщений: 153


Цитата:
Сообщение от Регистр Посмотреть сообщение
ХАМИТЬ
- это он не про тебя, а про меня (Я же задал вопрос и я воспринимаю это не как "хамление", а просто как предложение(вариант): "не надо извращаться - а просто математически найди и все..."(условно Леша ответил)). И я наверное больше нахамил тебе (ИЗВИНИ):
Цитата:
Сообщение от prajdziswet Посмотреть сообщение
это полный бред! как прочертить радиус круга - по кругу?

Цитата:
Сообщение от Регистр Посмотреть сообщение
как прочертить касательную к окружности без математичесих вычислений
задача не в том как начертить, просто начертить я начерчу = вопрос в том как используя програмно автокад без вычислений найти эту точку=> самый оптимальный вариант предложил "koMon", но он первый разы не срабатывает при запуске автокада, потом нормально работает.

А вы (ты) "Регистр" не совсем понял задачу Нажмите на изображение для увеличения
Название: Clip2net_200103120945.png
Просмотров: 33
Размер:	15.7 Кб
ID:	221721, понятно что она под прямым углом... но мы эту точку не знаем и почему ты радиус сразу строишь туда и т.д (радиус у тебя будет любая точка на окружности, а то что она касательная мы потом отсеиваем другие точки) => самый оптимальный вариант предложил "koMon"(но тут при самом первом запуске автокада, не работает-потом нормально), или второй вариант это расчеты...
prajdziswet вне форума  
 
Непрочитано 03.01.2020, 12:17
1 | 1 #20
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Дело было почти вечером, делать было нечего...
Код:
[Выделить все]
 (defun t1 (/ circle point a center radius)
  (if (and (= (type
                (setq circle (vl-catch-all-apply (function (lambda () (car (entsel "\nSelect circle <Cancel> : "))))))
                ) ;_ end of type
              'ename
              ) ;_ end of =
           (= (type (setq point (vl-catch-all-apply (function (lambda () (getpoint "\nSelect point <Cancel> : "))))))
              'list
              ) ;_ end of =
           point
           ) ;_ end of and
    (progn (setq center (cdr (assoc 10 (entget circle)))
                 radius (cdr (assoc 40 (entget circle)))
                 a      (/ radius (distance point center))
                 a      (- (* pi 0.5) (atan a (- 1 (* a a))))
                 ) ;_ end of setq
           (mapcar (function (lambda (sum)
                               (entmakex (list (cons 0 "line")
                                               (cons 10 point)
                                               (cons 11 (polar center (- (angle center point) (* sum a)) radius))
                                               ) ;_ end of list
                                         ) ;_ end of entmakex
                               ) ;_ end of lambda
                             ) ;_ end of function
                   '(1. -1.)
                   ) ;_ end of mapcar
           ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
----- добавлено через ~2 мин. -----
Сработает только если окружность и точка лежат в одной плоскости. Проверял только на WCS.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 03.01.2020, 13:35
#21
prajdziswet


 
Регистрация: 30.03.2015
Сообщений: 153


Спасибо буду разбираться: как то очень просто..
насчет третьей координаты я не беспокоюсь (я строю круги автоматически по 0)

п.с
....блин посмотрел все гениально просто! ...я бы сложнее все замутил =)))
СПАСИБО!

Последний раз редактировалось prajdziswet, 03.01.2020 в 15:28.
prajdziswet вне форума  
 
Непрочитано 03.01.2020, 16:41
#22
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


Цитата:
Сообщение от prajdziswet Посмотреть сообщение
как то очень просто..
Школьное решение прямоугольного треугольника
Миниатюры
Нажмите на изображение для увеличения
Название: Screenshot_20200103_163709.jpg
Просмотров: 39
Размер:	164.0 Кб
ID:	221723  
koMon вне форума  
 
Автор темы   Непрочитано 05.01.2020, 17:35
#23
prajdziswet


 
Регистрация: 30.03.2015
Сообщений: 153


блин все равно не получается сделать что хочу, все равно валиться при первом запуске автокада = но уже при обрезке
Код:
[Выделить все]
 
(defun DrawAndRegion0 (T1 T2 R1 R2 / a obj1 obj2 spistemp temp)
(agul_draw)
  (if (= 0.0 (distance T1 T2));угол наклона
  (alert "памылка кропки аднолькавые")
  (setq a (/ (- R2 R1) (distance T1 T2)) a (atan a (sqrt (- 1 (* a a)))))
)
  (print (/ (* a 180) pi))

  ; малюем рыски
(mapcar (function (lambda (sum)
(setq temp
	(entmakex (list (cons 0 "line")
	                (cons 10 (polar T1 sum R1))
	                (cons 11 (polar T2 sum R2))
	           ) ;_ end of list
	) ;_ end of entmakex
)
(if (/= nil temp nil) (ssadd temp spistemp));заносим в список
	                ) ;_ end of lambda
	    ) ;_ end of function
	                  (list (+ a (* pi 0.5) (angle T1 T2)) (- (angle T1 T2) a (* pi 0.5)))
) ;_ end of mapcar
;;;      (setq osm (getvar "osmode"))
;;;	(setvar "osmode" 0)
;;;  (vl-cmdf "_line" "_tan" (cadr (list obj1 (polar T1 (+ a (* pi 0.5) (angle T1 T2)) R1))) "_tan" (cadr (list obj2 (polar T2 (+ a (* pi 0.5) (angle T1 T2)) R2))) "")
;;;  (vl-cmdf "_line" "_tan" (cadr (list obj1 (polar T1 (- (angle T1 T2) a (* pi 0.5)) R1))) "_tan" (cadr (list obj2 (polar T2 (- (angle T1 T2) a (* pi 0.5)) R2))) "")
;;;(setvar "osmode" osm)
  ;режем	
(vl-cmdf "_trim" spistemp "" (cadr (list obj1 (polar T1 (angle T1 T2) R1))) "")
(vl-cmdf "_trim" spistemp "" (cadr (list obj2 (polar T2 (angle T2 T1) R2))) "")
(ssadd obj1 spistemp)
(ssadd obj2 spistemp)
 )
(defun agul_draw ()
  (vl-load-com);на всякий случай
  (setq spistemp (ssadd));образование списка для области
  (if (= nil spisall) (setq spisall (ssadd)));образование списка областей
  ;избавляемся от 3 координаты если есть
  (setq T1 (list (car T1) (cadr T1)))
  (setq T2 (list (car T2) (cadr T2)))
    (setq osm (getvar "osmode"))
	(setvar "osmode" 0);отключаем привязку
  (if (vl-cmdf "_.circle" T1 R1)
  (setq obj1 (entlast)) (alert "памылка"))
  (if (vl-cmdf "_.circle" T2 R2)
  (setq obj2 (entlast)) (alert "памылка"))
  (setvar "osmode" osm);
)
(DrawAndRegion0 '(0 0) '(100 0) 30 40)
Далее нормально:Нажмите на изображение для увеличения
Название: Clip2net_200105173134.png
Просмотров: 19
Размер:	1.5 Кб
ID:	221747 ...но первый раз уже при обрезке, актокад не обрезает круги. Или это баг автокада, или что-то непонимаю раньше прямые при первлм запуке с привязкой отказвался (точнее ничего не писал, сам выходил из программы). Тут просто не режет самый первый раз запуска....
п.с а точки для касательной вроде правильно определяет (единственное саша корень упустил=> но все равно ему спасибо)
prajdziswet вне форума  
 
Непрочитано 05.01.2020, 18:17
1 | 1 #24
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Хоть убей не понимаю, почему не вычислить все параметры математически, построить полилинию, и дальше уже с нею работать. Как вариант, без особого тестирования
----- добавлено через ~5 мин. -----
Сейчас немного погонял, код работает неправильно. Так что его удалил.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 05.01.2020 в 18:23.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.01.2020, 19:29
#25
prajdziswet


 
Регистрация: 30.03.2015
Сообщений: 153


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
почему не вычислить все параметры математически, построить полилинию
наверное так и буду делать ...
просто мне единственное не понятно, почему некоторые команды при первом запуске автокада не совсем коррректно работают...
п.с хотелось как проще, но наверное так и придется: вычислить и строить.

Последний раз редактировалось prajdziswet, 05.01.2020 в 19:35.
prajdziswet вне форума  
 
Непрочитано 05.01.2020, 22:20
1 | #26
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


prajdziswet, в чём вообще суть твоего лиспа? нарисовать плоскую фигуру как на пнг по двум заданным предварительно окружностям?
koMon вне форума  
 
Автор темы   Непрочитано 06.01.2020, 09:15
#27
prajdziswet


 
Регистрация: 30.03.2015
Сообщений: 153


Цитата:
Сообщение от koMon Посмотреть сообщение
prajdziswet, в чём вообще суть твоего лиспа? нарисовать плоскую фигуру как на пнг по двум заданным предварительно окружностям?
в общем да.
Впринципе я уже сделал как предложил Алексей
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
вычислить все параметры математически, построить полилинию
..единственное борюсь с четвертью тангенса угла (при постройке полилинии), но эта уже можно сказать отладка (чуть другой угол выдает, наверное при разности углов больше "п/2" надо этот угол от "п" отнимать =тут я уже разберусь).
_________________________________________________________
Всем БОЛЬШОЕ СПАСИБО!!!

п.с хотел без вычислений, но вернулся к вычислениям

...Еще раз БОЛЬШОЕ СПАСИБО!!!
prajdziswet вне форума  
 
Непрочитано 09.01.2020, 10:19
#28
koMon


 
Блог
 
Регистрация: 26.09.2017
Сообщений: 1,809


prajdziswet, в таком разе это вопрос про построение 2-х внешних касательных к двум окружностям, лежащим в одной плоскости, а то там...
не понятно чего ты так боишься вычислений!?

в новом годе на работе утром делать нечего)

Код:
[Выделить все]
 
(setq 2_circles_sset (ssget '((0 . "CIRCLE,ARC"))))
(if (< (vla-get-radius (setq major_circle_object (vlax-ename->vla-object (ssname 2_circles_sset 0))))
	   (vla-get-radius (setq minor_circle_object (vlax-ename->vla-object (ssname 2_circles_sset 1))))
	)
	(setq major_circle_object (vlax-ename->vla-object (ssname 2_circles_sset 1))
		  minor_circle_object (vlax-ename->vla-object (ssname 2_circles_sset 0))
	)
)
(setq difference_radius (- (setq major_radius (vla-get-radius major_circle_object))
						   (setq minor_radius (vla-get-radius minor_circle_object))
						)
 	  centers_distance (distance (vlax-get major_circle_object 'center) (vlax-get minor_circle_object 'center))
)
(if (> (+ (distance (vlax-get major_circle_object 'center) (vlax-get minor_circle_object 'center)) minor_radius) major_radius)
	(progn
		(setq sin_of_angle_1 (/ difference_radius centers_distance)
		 	  cos_of_angle_1 (sqrt (- 1.0 (* sin_of_angle_1 sin_of_angle_1)))
		 	  angle_1 (atan sin_of_angle_1 cos_of_angle_1)
		 	  major_circle_tangent_point_1 (polar (vlax-get major_circle_object 'center)
			  									  (setq minus_normal_angle_1 (- (angle (vlax-get minor_circle_object 'center)
			  									  	 	    					 	  		   (vlax-get major_circle_object 'center)
												  	 							        )
												  	 							        (- pi (- (* 0.5 pi) angle_1))
																			  	     )
												  )
												  major_radius
										   )
		 	  minor_circle_tangent_point_1 (polar (vlax-get minor_circle_object 'center)
			  									  minus_normal_angle_1
												  minor_radius
										   )
		 	  major_circle_tangent_point_2 (polar (vlax-get major_circle_object 'center)
			  									  (setq plus_normal_angle_1 (+ (angle (vlax-get minor_circle_object 'center)
			  									  	 	    					 	  		  (vlax-get major_circle_object 'center)
												  	 							       )
												  	 							       (- pi (- (* 0.5 pi) angle_1))
																			  	    )
												  )
												  major_radius
										   )
		 	  minor_circle_tangent_point_2 (polar (vlax-get minor_circle_object 'center)
			  									  plus_normal_angle_1
												  minor_radius
										   )
			  minor_included_angle (* 2.0 (- (* 0.5 pi) angle_1))
			  minor_bulge (/ (sin (* 0.25 minor_included_angle)) (cos (* 0.25 minor_included_angle)))
			  major_included_angle (- (* 2 pi) minor_included_angle)
			  major_bulge (/ (sin (* 0.25 major_included_angle)) (cos (* 0.25 major_included_angle)))
		)
    	(vlax-safearray-fill (setq pline_object_points_array (vlax-make-safearray vlax-vbdouble '(0 . 7)))
							 (list (car major_circle_tangent_point_1) (cadr major_circle_tangent_point_1)
							 	   (car minor_circle_tangent_point_1) (cadr minor_circle_tangent_point_1)
								   (car minor_circle_tangent_point_2) (cadr minor_circle_tangent_point_2)
								   (car major_circle_tangent_point_2) (cadr major_circle_tangent_point_2)
							 )
		)
		(setq bulges_list (list 0 (* -1 minor_bulge) 0 (* -1 major_bulge)))
    	(setq pline_object (vla-addlightweightpolyline (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))) pline_object_points_array))
		(vla-put-closed pline_object :vlax-true)
		(setq bulge_index 0)
		(foreach bulge_value bulges_list
			(vla-setbulge pline_object bulge_index bulge_value)
			(setq bulge_index (1+ bulge_index))
		)
		(command "_erase" 2_circles_sset "")
	)
)
koMon вне форума  
 
Автор темы   Непрочитано 09.01.2020, 13:20
#29
prajdziswet


 
Регистрация: 30.03.2015
Сообщений: 153


Там задача была чуть сложнее "чем к двум окружностям" - это частный случай, я уже сделал спасибо...
prajdziswet вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как построить касательную к окружности?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой язык перспективен для инженера-конструктора с условием The_Mercy_Seat Программирование 705 17.03.2021 14:19
Почему диаметр делительной окружности шлицевого соединения не равен сумме s+e? koval222 Машиностроение 4 19.09.2019 19:16
Помогите с лабораторной по AutoLISP (построить 6 шестригранников на окружности) itshpit LISP 19 15.11.2018 09:18
Как построить касательную к сплайну? Ромчик AutoCAD 5 14.05.2016 15:59
Построить касательную Абдула AutoCAD 31 13.11.2012 19:54