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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Программа: самопересечение полилинии

Программа: самопересечение полилинии

Ответ
Поиск в этой теме
Непрочитано 03.12.2004, 20:45 #1
Программа: самопересечение полилинии
Torino
 
Штаб
Регистрация: 21.08.2003
Сообщений: 943

Товарищи, программисты!
Напишите, пожалуйста, программу, которая находит самопересечения трехмерной полилинии (с определенным допуском), и помечает их красными точками.
Или подскажите алгоритм программы.
Просмотров: 3726
 
Непрочитано 03.12.2004, 22:01
#2
vk

сисадмин
 
Регистрация: 26.08.2003
Самара
Сообщений: 1,022
<phrase 1=


Не знаю, как насчет "с допуском", а явные можно попробовать примерно так:
- собрать список координат вершин по порядку следования их в полилинии.
- попробовать найти пересечения отрезков при помощи функции (inters). Порядок проверки такой
-- 1-2 с 3-4,4-5,5-6....
-- 2-3 с 4-5,5-6,6-7...
-- 3-4 с 5-6,6-7,7-8.... и тэдэ
vk вне форума  
 
Непрочитано 04.12.2004, 00:25
#3
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


;; Как вариант :

;; 12/4/04 0:16 AM
;; Intersection 3dpoly itself

(defun inactx ()
(vl-load-com)
(setq adoc
(vla-get-activedocument
(vlax-get-acad-object))
mdsp (vla-get-modelspace adoc)))

(defun conapp (lst / rlst)
(cond
((null lst) nil)
(T (append rlst (list (list (car lst)(cadr lst)(caddr lst)))
(conapp (cdddr lst))))))

(defun catchlist (pnt)
(vl-load-com)
(if pnt (vl-catch-all-apply
'vlax-safearray->list
(list (vlax-variant-value pnt)))))
;______end of 'helpers_____;

(defun C:ters (/ ob1 ob2 pts rlst
adoc cir en int_lst
mdsp vlst x)
(inactx)
(setq en (car (entsel "\nВыбрать примитив : >>> \n"))
ob1 (vlax-ename->vla-object en)
ob2 (vla-copy ob1)
pts (vl-catch-all-apply 'vla-IntersectWith (list ob1 ob2
acExtendNone))
)
(cond
((vl-catch-all-error-p pts) nil)
((vl-catch-all-error-p
(setq pts (catchlist pts))) nil)
(t pts (while pts
(setq rlst (cons (list (car pts)(cadr pts)(caddr pts))rlst)
pts (cdddr pts))) rlst))
(print rlst)
(setq vlst (conapp (catchlist (vla-get-coordinates ob1))))
(print vlst)
(setq int_lst (vl-remove-if
(function (lambda (X)
(member X vlst))) rlst))
(mapcar '(lambda (x)
(setq cir (vla-addsphere mdsp x 0.2))
(vla-put-color cir acred))
(mapcar 'vlax-3d-point int_lst))
(vla-delete ob2)
(vlax-release-object ob1)
(vla-zoomextents (vla-get-application adoc))
(vla-regen adoc acActiveViewport)
(princ)
)
Олег (jr.) вне форума  
 
Автор темы   Непрочитано 04.12.2004, 13:36
#4
Torino


 
Регистрация: 21.08.2003
Штаб
Сообщений: 943
<phrase 1=


>>vk
Спасибо за идею.

>>Олег
Спасибо за программу!
Она работает! Особенно понравились красные шары в местах перечечений
Torino вне форума  
 
Непрочитано 04.12.2004, 16:16
#5
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Боюсь рутина многое не учитывает, например, если пересечение пойдет по вершинам, а насчет красных шаров.. .меня так и подмывало заменить их на медные.
Олег (jr.) вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Программа: самопересечение полилинии