I struggled for a while until I didn't figured out whats the catch (seen triangulate.lsp - DTM function)... The catch was to check for every 3 points circumcircle against rest of points and find those 3 for witch no other rest points are inside circumcircle... My version of DTM is I guess preciser than DTM, but it's so much slower, I strongly suggest to use DTM.vlx... So here is my version (all before posts refer to this triangulation witch I finally got wright)...
- (defun averpttriang (triangle) (mapcar '(lambda (a b c) (/ (+ a b c) 3.0)) (car triangle) (cadr triangle) (caddr triangle)))(defun unique (lst) (if lst (cons (car lst) (unique (vl-remove (car lst) (cdr lst))))))(defun uniquetriangles (triangles / lst assoctriangles uniquetriangs) (foreach triangle triangles (setq lst (cons (averpttriang triangle) lst)) ) (setq lst (unique lst)) (foreach triangle triangles (setq assoctriangles (cons (cons (averpttriang triangle) triangle) assoctriangles)) ) (foreach averpt lst (setq uniquetriangs (cons (cdr (assoc averpt assoctriangles)) uniquetriangs)) ) uniquetriangs)(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 ( / msp ss n pt ptlst pttlst p1 p2 p3 circle tst lst triangles) (vl-load-com) (setq msp (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))) (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)) (foreach pp (vl-remove p3 (vl-remove p2 (vl-remove p1 pttlst))) (if (not (ptinsidecir pp circle)) (setq tst (cons T tst)) (setq tst (cons nil tst))) ) (if (eval (cons 'and tst)) (setq lst (cons p1 lst) lst (cons p2 lst) lst (cons p3 lst))) (if lst (setq triangles (cons lst triangles))) (setq lst nil) (setq tst nil) (setq ptlst (vl-remove p1 ptlst)) (setq ptlst (vl-remove p2 ptlst)) (setq ptlst (vl-remove p3 ptlst)) (setq ptlst (cons p3 ptlst)) (setq ptlst (cons p2 ptlst)) ) ) ) (foreach triangle (uniquetriangles triangles) (vla-add3dface msp (vlax-3d-point (car triangle)) (vlax-3d-point (cadr triangle)) (vlax-3d-point (caddr triangle)) (vlax-3d-point (caddr triangle))) ) (princ))
BIGAL, you're wright ab interpolation of points... It's totally unnecessary as these 3dfaces represent just that...
pBe, thanks for your hidden suggestion not to suggest anything - it made me think and search for solution...
Keep coding
Regards, M.R. |