Re: Как найти координаты точки пересечения окружности и отрезка?
> Олег
Решает только эту задачу.
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → LISP → Как найти координаты точки пересечения окружности и отрезка?
Чтобы отправить ответ, вы должны войти или зарегистрироваться
> Олег
Решает только эту задачу.
> ZZZ
А что, автор темы просил решить другую задачу?
А чего стоят подходы с trim и _fence, если объекты за границами экрана?
> Олег
А как пользователь выбирает примитивы (ручками)?
И при большом желании можно переключится (модель/лист) и приблизится (vl-cmdf "_.zoom" "_o" ss ) к исходным примитивам где бы они не были.
Олег вы решили поставленную задачу даже очень хорошо, просто и доходчиво, никто не спорит. Чувствуется рука мастера.
В тоже время согласитесь, что и другие методы решения поставленной задачи тоже имеют право жить, к тому же они более универсальны. На то он и форум чтобы рассматривать различные идеи. Я же не лобирую только (ssget "_F" ...), если вы не заметили.
> Олег
У вашей програмки есть один большой плюс, она находит обе точки пересечения с линией (у меня только одну). Только одно но. Если линия заканчивается внутри окружности, то прога также находит другую точку пересечения. Из это следует, что Ваша программа ищет точки пересечения окружности и прямой. И не понятно, что именно там пересекается линия, а не её продолжение.
Таким образом оба подхода не идеальны.
НИЧЬЯ :)
> Олег
Извините, я просто не успел еще опробовать и разобраться (с LISPом занимаюсь не долго, поэтому богло глянув на код оценить способ мне трудно) не хватило времени :(
а вообще все советы очень ценные - большое спасибо :)
> ZZZ
а вот так вроде лучше:
(setq ent_line (car(entsel"\nSelect LINE "))) (setq pt1 (cdr(assoc 10(entget ent_line)))) (setq pt2 (cdr(assoc 11(entget ent_line)))) (setq ss(ssget "_F" (list pt1 pt2) '((0 . "CIRCLE")))) ;(setq pt_list(mapcar '(lambda (a) (cadr (last a))) (ssnamex ss))) (setq pt_list (mapcar 'cadr (cdddar (ssnamex ss))))
выдаёт две точки.
Кстати результаты с Олегом похожие но немного разные.
Наверное у меня точность хромает (даже при отключенных привязках). :(
;Экперименты с TRIM
;На разных машинах работают по разному
;на обоих AC2004 engl
;На одной машине обрезает и линию и окружность?
; в одном варианте слева а вдругом справа?
;На другой машине
; обрезает только отрезок (так и нужно)
; вар.1 с одной стороны, вар.2 с другой стороны
; почему?
(defun fun1 ()
(setq okrname (entmakex '((0 . "CIRCLE") (10 0.0 0.0 0.0) (40 . 50.0))))
(setq linname (entmakex '((0 . "LINE") (10 10.0 -20.0 0.0) (11 40.0 60.0 0.0))))
)
; Вариант1
(defun c:funv1 (/ a1 a2 a3)
(fun1)
(setq a1 (ssget (list 40 60)) a2 (ssget (list 0 50)) a3 (list 40 60))
(command "_.trim" "" a1 a2 "" a3 "")
)
; Вариант2
(defun c:funv2 (/ a3)
(fun1)
(setq a3 (list 40 60))
(command "_.trim" "" okrname linname "" a3 "")
)
> ZZZ
> DMS
- при указании курсором с привязкой координаты различаются в третьем знаке после зап. - выбирать руками (надо автоматически)
> Олег
работает нормально, только здесь математика (т.е. повторно вычисляеся уже вычисленное автокадом значения, по моему предположению; хотя с обрезкой тоже хрен редьки не слаще - тоже дополнительные манипуляции)
> Начинающий
Отключай привязки
> ZZZ
Привязки отключены.
я имею в виду, что когда код отработал, запускаю каую-нибудь команду с включенными привязками и сравниваю координаты точки на которую указывает курсор со списком координат, полученным после работы кода - разница на третьем знаке после запятой.
Вместо того , чтобы воспользоваться
удобной встроенной функцией , вы
пытаетесь усложнить себе жизнь.
Только непонятно зачем ?
(vlax-safearray->list (vlax-variant-value (vla-intersectwith vla-circle vla-line acExtendNone )))
> Эдуард
Спасибо, это я уже уяснил
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → LISP → Как найти координаты точки пересечения окружности и отрезка?
Форум работает на PunBB, при поддержке Informer Technologies, Inc