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

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

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

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

Как программно построить касательную к окружности, допустим знаем точку и имя окружности?
п.с высчитывать координаты не хочется,точку на окружности
Код:
[Выделить все]
 
(setq x1 (getpoint))
(setq s1 (ssname (ssget) 0))
Заранее благодарю.
Просмотров: 5299
 
Автор темы   Непрочитано 03.01.2020, 13:35
#21
prajdziswet


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


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

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

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


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


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


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


блин все равно не получается сделать что хочу, все равно валиться при первом запуске автокада = но уже при обрезке
Код:
[Выделить все]
 
(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
С.-Петербург
Сообщений: 39,848


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

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


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


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

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


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


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


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


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

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

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


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


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
Сообщений: 152


Там задача была чуть сложнее "чем к двум окружностям" - это частный случай, я уже сделал спасибо...
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