多段线优化去除非关键点,求优化
编了一个多段线去除非关键点的小东西,但是感觉算法冗余,求优化。;;;-----------------------------------------------------------;;;;; 两向量相减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)))))
)
(setqent1 (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)
)
)
)
)
)
)
fan_zh 发表于 2015-9-1 09:32 static/image/common/back.gif
我发过一个多段线的优化程序,可以看我的贴
你的不是源码,看不到算法 有没有把曲线变圆滑一些的啊 overkill不是有定功能吗 非关键点是什么意思,同一直线上的点都去掉,貌似你这个没考虑凸度吧,如果不考虑凸度的话,我觉得求交点就可以了。 edata 发表于 2015-9-1 00:51 static/image/common/back.gif
非关键点是什么意思,同一直线上的点都去掉,貌似你这个没考虑凸度吧,如果不考虑凸度的话,我觉得求交点就 ...
基本是这个意思,非关键点就是指非顶点上的点,我这个凸度没影响吧,只有同直线的才有影响,对同直线的线宽会有影响。 我发过一个多段线的优化程序,可以看我的贴 1去除直线段上中间的点:依次取1,2,3点,如果把2投影到13,距离为0,并且它在13之内,去掉2
2.折返点同上,如果2在13之外,去掉2
3.整合凸度,连续两点凸度值不为0且相等,只要第二点不是最后一点将其去掉?
最后,1,2两步是否能否综合。。。
我 写了个多段线去重,可能跟你的差不多,出没有考虑线宽,凸度的的问题。其实要考虑也不复杂。见你用点积,应该是不错的程序了。 llsheng_73 发表于 2015-9-1 10:33 static/image/common/back.gif
1去除直线段上中间的点:依次取1,2,3点,如果把2投影到13,距离为0,并且它在13之内,去掉2
2.折返点同上 ...
感谢回贴,凸度和线宽确实没有考虑,只要是在一条直线上的多余点全部去除了,不在同一直线上的凸度和线宽无影响。 自贡黄明儒 发表于 2015-9-1 10:52 static/image/common/back.gif
我 写了个多段线去重,可能跟你的差不多,出没有考虑线宽,凸度的的问题。其实要考虑也不复杂。见你用点积, ...
黄大师,我觉得主要是在更新对象表的时候复杂了,大师有没有好的方法? 本帖最后由 llsheng_73 于 2015-9-1 13:02 编辑
springwillow 发表于 2015-9-1 12:21 static/image/common/back.gif
黄大师,我觉得主要是在更新对象表的时候复杂了,大师有没有好的方法?
去除一个顶点的时候,需要连续去掉4个组。。。。相信这个不难
至于总点数,好象可以不用管它,基本上如果把数据分成3部分,10组之前的,第一个10组到最后一个42组之间的,最后的
再把中间部分4个一组,这样随便想去除哪个点都特别方便了,最后append起来后进行entmod就了事了
可以参考下
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=169106&fromuid=202795
另外凸度也是必须要考虑的,不然可能把连续几个曲线段弄成一个直线段导致彻底变形。。。。
页:
[1]
2