好久沒有來曉東交流啦,偶爾也只是來灌下水。。。。
呵呵。。。
不知道樓主的所謂"光滑“是什么意思。。。猜應該是指復線在某個頂點處平滑過度吧。。在所有頂點都平滑過度那么這復線就"光滑"咯?
以前有寫過這樣一段不知是否符合樓主的意思。。
- (defun hy_pointissharp(pline point / obj param deriv-1 deriv);;;判斷復線上的頂點是否為尖點
- (defun count(o num)
- (cond ((< o 0) (+ num o))
- ((> o num) (- o num))
- (t o)
- )
- )
- (setq obj (vlax-ename->vla-object pline)
- param (vlax-curve-getparamatpoint obj point)
- numo (cdr (assoc 90 (entget pline)))
- )
-
- (if(vlax-curve-isclosed pline)
- (progn
- (setq deriv-1 (vlax-curve-getfirstderiv obj (count (- param 1e-10) numo))
- deriv (vlax-curve-getfirstderiv obj param)
- )
- (cond ((and (not (equal (car deriv-1) 0 1e-8)) (not (equal (car deriv) 0 1e-8)))
- (if (equal (/ (cadr deriv-1) (car deriv-1))
- (/ (cadr deriv) (car deriv))
- 1e-3)
- t
- nil
- ))
- ((and (equal (car deriv-1) 0 1e-8) (equal (car deriv) 0 1e-8)) t)
- (t nil)
- )
- )
- (if (and (/= param (vlax-curve-getstartparam obj))
- (/= param (vlax-curve-getendparam obj))
- )
- (progn (setq deriv-1 (vlax-curve-getfirstderiv obj (count (- param 1e-10) numo))
- deriv (vlax-curve-getfirstderiv obj param)
- )
- (cond ((and (not (equal (car deriv-1) 0 1e-8)) (not (equal (car deriv) 0 1e-8)))
- (if (equal (/ (cadr deriv-1) (car deriv-1))
- (/ (cadr deriv) (car deriv))
- 1e-3)
- t
- nil
- ))
- ((and (equal (car deriv-1) 0 1e-8) (equal (car deriv) 0 1e-8)) t)
- (t nil)
- )
- )
- nil)
- )
- )
程序說明:pline 是復線 point 是復線上的一頂點 如果程序返回T說明在該點處 不"平滑"反之則"平滑"..
主要思路:取得距離該點處很近前后各一點,判斷各自的切線斜率,如果很接近(其中會有一個很小的誤差值存在)那末表示該點平滑否則則為尖點 (利用一階導數) |