;; | ---------------------------------------------------------------------------- ;; | GE_DensifyRandom ;; | ---------------------------------------------------------------------------- ;; | Function : Densifies a list of points by specifying a range value of minimum ;; | maximum value. The densification is done based on random values ;; | selected in between the minimum and maximum values. ;; | Arguments: ;; | 'vlist' - List of points to be densified ;; | 'MinSegLen' - Minimum segment length ;; | 'MaxSegLen' - Maximum segment length ;; | 'SegTol' - Segment Tolerance (distances less than these will not ;; | be created) ;; | Action : Returns a list of the randomly densified points ;; | Updated : May 20, 2001 ;; | e-mail : rakesh.rao@4d-technologies.com ;; | Web : www.4d-technologies.com ;; | ---------------------------------------------------------------------------- (defun GE_DensifyRandom (vlist MinSegLen MaxSegLen SegTol / ang cnt pt1 pt2 len len1 len2 vlist1 tmp More Diff ) (if vlist (progn (setq len (length vlist) vlist1 (list (car vlist)) cnt 0 Diff (abs (- MaxSegLen MinSegLen)) ) (repeat (1- len) (setq pt1 (nth cnt vlist) pt2 (nth (1+ cnt) vlist) len1 (distance pt1 pt2) ) (if (> len1 MinSegLen) (progn (setq ang (angle pt1 pt2) len2 0.0 More T ) (while More (setq tmp (+ MinSegLen (* (MI_RandNum) Diff)) pt1 (polar pt1 ang tmp) len2 (+ len2 tmp) ) (if (< len2 len1) (progn (cond ((<= (setq tmp (distance pt1 pt2)) MinSegLen) (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 )