试试这个:
- ;|3D bezier curve
- _____mfuccaro@hotmail.com___2008.10
- |;
- (defun c:bezier( / division result lp p)
- (setq division 100)
- (setq result nil)
- (setq lp nil p t)
- (while p
- (setq p (getpoint "select point"))
- (if p (setq lp (cons (trans p 1 0) lp)))
- )
- (setq r (/ 1.0 division))
- (repeat division
- (setq p (reverse lp))
- (setq result (cons (car (r1 p r)) result))
- (setq r (+ r (/ 1.0 division)))
- )
- (setq result (cons (car lp) (reverse result)))
- (make3dpoly result)
- (princ)
- )
- (defun div(a b r / i p)
- (setq i -1 p nil)
- (foreach x a
- (setq p (cons (+ (* r (nth (setq i (1+ i)) a)) (* (- 1 r) (nth i b))) p))
- )
- (reverse p)
- )
- (defun parc1(p r / i l p1)
- (setq i 0 l (length p) p1 nil)
- (repeat (1- l)
- (setq a (nth i p))
- (setq b (nth (1+ i) p))
- (setq p1 (cons (div a b r) p1))
- (setq i (1+ i))
- )
- (reverse p1)
- )
- (defun r1(p r / p1)
- (repeat (1- (length p))
- (setq p1 (parc1 p r))
- (setq p p1)
- )
- )
- (defun make3dpoly (vertlist)
- (entmake (list '(0 . "POLYLINE")'(66 . 1)'(100 . "AcDb3dPolyline")'(70 . ))
- (foreach point vertlist
- (entmake (list (cons 0 "VERTEX")'(100 . "AcDb3dPolylineVertex")'(70 . 32)(cons 10 point))))
- (entmake '((0 . "SEQEND")))
- )
仅在WCS中测试! |