一个函数,返回表内容是LWPOLYLINE的顶点及加密点,需要参数是LWPOLYLINE的图元名,及曲线上圆弧的加密段数。 - (defun getptlist(ename n / dl dlpt dl1 pt1 ptdl dlpt1 ratio H R pm L pto ptm pt3 angle)
- (setq dl (entget ename)
- dlpt (member (assoc 10 dl) dl)
- dl1 (car dlpt)
- pt1 (cdr dl1)
- ptdl (list pt1)
- );setq
- (while dlpt
- (setq dlpt1 (cdr dlpt))
- (setq ratio (cdar (member (assoc 42 dlpt1) dlpt1)))
- (if (not (zerop ratio))
- (progn
- (setq pm (/ ratio (abs ratio))
- ratio (abs ratio)
- pt2 (cdar (member (assoc 10 dlpt1) dlpt1))
- L (distance pt1 pt2)
- H (/ (* L (- 1.0 (* ratio ratio))) (* 4.0 ratio))
- R (/ (* L (+ 1.0 (* ratio ratio))) (* 4.0 ratio))
- ptm (polar pt1 (angle pt1 pt2) (/ L 2.0))
- pto (polar ptm (+ (angle pt1 pt2) (* pm pi 0.5)) H)
- angle 0
- );setq
- (repeat (- n 1)
- (setq angle (+ angle (* (/ (atan ratio) n) pm 4.0))
- pt3 (polar pto (+ (angle pto pt1) angle) R)
- ptdl (append ptdl (list pt3))
- );setq
- );repeat
- );progn
- );if
- (setq dlpt (member (assoc 10 dlpt1) dlpt1))
- (if dlpt
- (progn
- (setq dl1 (car dlpt))
- (setq pt1 (cdr dl1))
- (setq ptdl (append ptdl (list pt1)))
- );progn
- );if
- );while
- ptdl
- )
代码是很早以前写的,有点脏,有些算法很傻,例如凸度还判断正负了,写的时候没仔细推公式, 。还有就是返回的都是世界坐标系的xy平面内的坐标,如果是lwpolyline所在平面不是世界坐标系的xy平面,得到的结果还要处理,这部分算法虽然不难,但是还没写进去。 |