Just sligthly more improvement in speed - on my other PC not netbook previous code did for 50 3d pts in 10 sec... Now it did in 8 sec...
- (defun nearest (pt lst / d1 d2 p1 p2) (setq lst (vl-remove pt lst)) (setq d1 (distance pt (car lst)) p1 (car lst) ) (foreach p2 (cdr lst) (if (> d1 (setq d2 (distance pt p2))) (setq d1 d2 p1 p2) ) ) p1)(defun averpttriang (p1 p2 p3) (mapcar '(lambda (a b c) (/ (+ a b c) 3.0)) p1 p2 p3))(defun mid (p1 p2) (mapcar '(lambda (a b) (/ (+ a b) 2.0)) p1 p2))(defun circumtriang (p1 p2 p3 / pp1 pp2 pp3 mp1p2 mp2p3 npmp1p2 npmp2p3 cen rad) (setq pp1 (list (car p1) (cadr p1))) (setq pp2 (list (car p2) (cadr p2))) (setq pp3 (list (car p3) (cadr p3))) (setq mp1p2 (mid pp1 pp2)) (setq mp2p3 (mid pp2 pp3)) (setq npmp1p2 (polar mp1p2 (+ (angle pp1 pp2) (/ pi 2.0)) 1.0)) (setq npmp2p3 (polar mp2p3 (+ (angle pp2 pp3) (/ pi 2.0)) 1.0)) (setq cen (inters mp1p2 npmp1p2 mp2p3 npmp2p3 nil)) (setq rad (distance cen p1)) (list cen rad))(defun ptinsidecir (pt circle) (setq pt (list (car pt) (cadr pt))) (> (cadr circle) (distance (car circle) pt)))(defun c:triangulate ( / ss n pt ptlst pttlst p1 p2 p3 circle pp lst avrpt avrlst triangles) (setq ss (ssget '((0 . "POINT")))) (repeat (setq n (sslength ss)) (setq pt (cdr (assoc 10 (entget (ssname ss (setq n (1- n))))))) (setq ptlst (cons pt ptlst)) ) (setq pttlst ptlst) (while (> (length ptlst) 2) (setq p1 (car ptlst)) (foreach p2 (cdr ptlst) (foreach p3 (vl-remove p2 (cdr ptlst)) (setq circle (circumtriang p1 p2 p3)) (setq pp (nearest (car circle) (vl-remove p1 (vl-remove p2 (vl-remove p3 pttlst))))) (if (not (ptinsidecir pp circle)) (progn (setq lst (cons p1 lst) lst (cons p2 lst) lst (cons p3 lst)) (setq avrpt (averpttriang p1 p2 p3)) ) (setq avrpt nil) ) (if (and avrpt (not (member avrpt avrlst))) (progn (setq avrlst (cons avrpt avrlst)) (setq triangles (cons lst triangles)) ) ) (setq lst nil) (if (equal p1 (car ptlst) 1e- (setq ptlst (cdr ptlst))) ) ) ) (foreach triangle triangles (entmake (list (cons 0 "3DFACE")(cons 10 (car triangle))(cons 11 (cadr triangle))(cons 12 (caddr triangle))(cons 13 (caddr triangle)))) ) (princ))
P.S. Checked again with 100 pts - previous code : 2min 35sec; this new code : 53sec
But for 200 pts, new code works for : 14min 12sec... So slow...
M.R. |