springwillow 发表于 2015-8-31 20:09:17

多段线优化去除非关键点,求优化

编了一个多段线去除非关键点的小东西,但是感觉算法冗余,求优化。;;;-----------------------------------------------------------;;
;;; 两向量相减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)
      )
    )
)
      )
    )
)
      

springwillow 发表于 2015-9-1 09:36:04

fan_zh 发表于 2015-9-1 09:32 static/image/common/back.gif
我发过一个多段线的优化程序,可以看我的贴

你的不是源码,看不到算法

sunjun2009 发表于 2018-5-22 22:31:07

有没有把曲线变圆滑一些的啊

myjping 发表于 2017-12-28 08:23:18

overkill不是有定功能吗

edata 发表于 2015-9-1 00:51:06

非关键点是什么意思,同一直线上的点都去掉,貌似你这个没考虑凸度吧,如果不考虑凸度的话,我觉得求交点就可以了。

springwillow 发表于 2015-9-1 09:12:23

edata 发表于 2015-9-1 00:51 static/image/common/back.gif
非关键点是什么意思,同一直线上的点都去掉,貌似你这个没考虑凸度吧,如果不考虑凸度的话,我觉得求交点就 ...

基本是这个意思,非关键点就是指非顶点上的点,我这个凸度没影响吧,只有同直线的才有影响,对同直线的线宽会有影响。

fan_zh 发表于 2015-9-1 09:32:20

我发过一个多段线的优化程序,可以看我的贴

llsheng_73 发表于 2015-9-1 10:33:58

1去除直线段上中间的点:依次取1,2,3点,如果把2投影到13,距离为0,并且它在13之内,去掉2
2.折返点同上,如果2在13之外,去掉2
3.整合凸度,连续两点凸度值不为0且相等,只要第二点不是最后一点将其去掉?

最后,1,2两步是否能否综合。。。

自贡黄明儒 发表于 2015-9-1 10:52:47

我 写了个多段线去重,可能跟你的差不多,出没有考虑线宽,凸度的的问题。其实要考虑也不复杂。见你用点积,应该是不错的程序了。

springwillow 发表于 2015-9-1 12:18:52

llsheng_73 发表于 2015-9-1 10:33 static/image/common/back.gif
1去除直线段上中间的点:依次取1,2,3点,如果把2投影到13,距离为0,并且它在13之内,去掉2
2.折返点同上 ...

感谢回贴,凸度和线宽确实没有考虑,只要是在一条直线上的多余点全部去除了,不在同一直线上的凸度和线宽无影响。

springwillow 发表于 2015-9-1 12:21:13

自贡黄明儒 发表于 2015-9-1 10:52 static/image/common/back.gif
我 写了个多段线去重,可能跟你的差不多,出没有考虑线宽,凸度的的问题。其实要考虑也不复杂。见你用点积, ...

黄大师,我觉得主要是在更新对象表的时候复杂了,大师有没有好的方法?

llsheng_73 发表于 2015-9-1 12:46:35

本帖最后由 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
查看完整版本: 多段线优化去除非关键点,求优化