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

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

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

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

Как программно построить касательную к окружности, допустим знаем точку и имя окружности?
п.с высчитывать координаты не хочется,точку на окружности
Код:
[Выделить все]
 
(setq x1 (getpoint))
(setq s1 (ssname (ssget) 0))
Заранее благодарю.
Просмотров: 5293
 
Непрочитано 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
Сообщений: 152


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

Последний раз редактировалось 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,680


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


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


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

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

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


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


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


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


я и хочу попробывать скормить список из имени окружности и точки - вместо 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,680


это уже вычисления
Код:
[Выделить все]
 (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
Сообщений: 152


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


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


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


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


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

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


А привязки случайно не срабатывают?
__________________
Моя библиотека 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
С.-Петербург
Сообщений: 39,844


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


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


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 Кб, 28 просмотров)
__________________
Сам по себе

Последний раз редактировалось Регистр, 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
С.-Петербург
Сообщений: 39,844


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


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


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

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

А вы (ты) "Регистр" не совсем понял задачу Нажмите на изображение для увеличения
Название: Clip2net_200103120945.png
Просмотров: 32
Размер:	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
С.-Петербург
Сообщений: 39,844


Дело было почти вечером, делать было нечего...
Код:
[Выделить все]
 (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 вне форума  
Ответ
Вернуться   Форум 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