编了一个多段线去除非关键点的小东西,但是感觉算法冗余,求优化。 - ;;;-----------------------------------------------------------;;
- ;;; 两向量相减 subtraction ;;
- ;;; Input: v1,v2 -vectors in R^n ;;
- ;;; OutPut: A vector ;;
- ;;;-----------------------------------------------------------;;
- (defun MAT:v-v (v1 v2)
- (mapcar '- v1 v2)
- )
- ;;;-----------------------------------------------------------;;
- ;;; 两个2d向量的叉积的数值 ;;
- ;;; 输入: 两个点(或者两个向量) ;;
- ;;; 输出: 一个数值.如果为正则是逆时针,两向量形成的平面法线向量;;
- ;;; 向上,为负则是顺时针,为零则两向量共线或平行。 ;;
- ;;; 这个数值也为原点,P1,P2三点面积的两倍。 ;;
- ;;;-----------------------------------------------------------;;
- (defun MAT:Det2V (v1 v2)
- (- (* (car v1) (cadr v2)) (* (car v2) (cadr v1)))
- )
- ;判断多段线折向
- (defun plzhexiang (p0 p1 p2)
- (MAT:Det2V(MAT:v-v p2 p0)(MAT:v-v p1 p0))
- )
- (defun c:jfpl (/ ss pts sslen ename ent ent1 pt1 pt2 pt3 i)
- (if (setq ss (ssget '((0 . "LWPOLYLINE"))))
- (progn
- (repeat (setq sslen (sslength ss))
- (setq pts '())
- (setq ename (ssname ss (setq sslen (1- sslen))))
- (setq ent (entget ename))
- (mapcar '(lambda (x)(if (= (car x) 10)(setq pts (cons (cdr x) pts)))) ent)
- (cond ((and (= (cdr (assoc 70 ent)) 0)(equal (car pts)(last pts)))
- (entmod (append (vl-remove (cons 10 (car pts))(subst (cons 70 1) (assoc 70 ent) ent)) (list (cons 10 (car pts)))))
- (entupd ename)
- (setq pts (append pts (list (cadr pts))))
- )
- ((= (cdr (assoc 70 ent)) 1) (setq pts (append pts (list (car pts)(cadr pts)))))
- )
- (setq ent1 (entget ename))
- (setq i 0)
- (if (> (length pts) 2)
- (progn
- (repeat (-(length pts)2)
- (setq pt1 (nth i pts) pt2 (nth (1+ i) pts) pt3 (nth (+ i 2) pts))
- (if (equal (plzhexiang pt1 pt2 pt3) 0 1e-6)
- (setq ent1 (vl-remove (cons 10 pt2) ent1)))
- (setq i (1+ i))
- )
- (entmod ent1)
- )
- )
- )
- )
- )
- )
-
|