;; | ---------------------------------------------------------------------------- ;; | GE_Densify ;; | ---------------------------------------------------------------------------- ;; | Function : Densifies a list of points by specifying a minimum inter-vertex ;; | distance to be applied between the points. ;; | Arguments: ;; | 'vlist' - List of points to be densified ;; | 'SegLen' - Maximum allowed length of each segment to be maintained ;; | 'SegTol' - Segment Tolerance (distances less than these will not ;; | be created) ;; | Action : Returns a list of densified points ;; | Updated : August 3, 1998 ;; | e-mail : rakesh.rao@4d-technologies.com ;; | Web : www.4d-technologies.com ;; | ---------------------------------------------------------------------------- (defun GE_Densify (vlist SegLen SegTol / ang cnt pt1 pt2 len len1 len2 vlist1 tmp More) (if vlist (progn (setq len (length vlist) vlist1 (list (car vlist)) cnt 0 ) (repeat (1- len) (setq pt1 (nth cnt vlist) pt2 (nth (1+ cnt) vlist) ) (setq len1 (distance pt1 pt2)) (if (> len1 SegLen) (progn (setq ang (angle pt1 pt2) len2 0.0 More T ) (while More (setq pt1 (polar pt1 ang SegLen) len2 (+ len2 SegLen) ) (if (< len2 len1) (progn (setq tmp (distance pt1 pt2)) (cond ((<= tmp SegLen) (if (> tmp SegTol) (setq vlist1 (cons (list (car pt1) (cadr pt1) 0.0) vlist1)) ) (setq vlist1 (cons (list (car pt2) (cadr pt2) 0.0) vlist1)) ) (T (setq vlist1 (cons (list (car pt1) (cadr pt1) 0.0) vlist1)) ) ) ) (progn (setq More nil) (if (not (equal (car vlist1) pt2)) (setq vlist1 (cons pt2 vlist1)) ) )) ) ) (setq vlist1 (cons pt2 vlist1)) ) (setq cnt (1+ cnt)) ) (setq vlist1 (reverse vlist1) vlist1 (GE_Interpolate vlist1 0.0000001) vlist vlist1 ) )) vlist )