明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3260|回复: 14

[源码] 多段线优化去除非关键点,求优化

[复制链接]
发表于 2015-8-31 20:09 | 显示全部楼层 |阅读模式
编了一个多段线去除非关键点的小东西,但是感觉算法冗余,求优化。
  1. ;;;-----------------------------------------------------------;;
  2. ;;; 两向量相减  subtraction                                   ;;
  3. ;;; Input: v1,v2 -vectors in R^n                              ;;
  4. ;;; OutPut: A vector                                          ;;
  5. ;;;-----------------------------------------------------------;;
  6. (defun MAT:v-v (v1 v2)
  7.   (mapcar '- v1 v2)
  8. )
  9. ;;;-----------------------------------------------------------;;
  10. ;;; 两个2d向量的叉积的数值                                    ;;
  11. ;;; 输入: 两个点(或者两个向量)                              ;;
  12. ;;; 输出: 一个数值.如果为正则是逆时针,两向量形成的平面法线向量;;
  13. ;;;       向上,为负则是顺时针,为零则两向量共线或平行。      ;;
  14. ;;;       这个数值也为原点,P1,P2三点面积的两倍。              ;;
  15. ;;;-----------------------------------------------------------;;
  16. (defun MAT:Det2V (v1 v2)
  17.   (- (* (car v1) (cadr v2)) (* (car v2) (cadr v1)))
  18. )

  19. ;判断多段线折向
  20. (defun plzhexiang (p0 p1 p2)
  21.   (MAT:Det2V(MAT:v-v p2 p0)(MAT:v-v p1 p0))
  22.   )
  23. (defun c:jfpl (/ ss pts sslen ename ent ent1 pt1 pt2 pt3 i)
  24.   (if (setq ss (ssget '((0 . "LWPOLYLINE"))))
  25.     (progn
  26.       (repeat (setq sslen (sslength ss))
  27.   (setq pts '())
  28.   (setq ename (ssname ss (setq sslen (1- sslen))))
  29.   (setq ent (entget ename))
  30.   (mapcar '(lambda (x)(if (= (car x) 10)(setq pts (cons (cdr x) pts)))) ent)
  31.   (cond ((and (= (cdr (assoc 70 ent)) 0)(equal (car pts)(last pts)))
  32.       (entmod (append (vl-remove (cons 10 (car pts))(subst (cons 70 1) (assoc 70 ent) ent)) (list (cons 10 (car pts)))))
  33.       (entupd ename)
  34.       (setq pts (append pts (list (cadr pts))))
  35.       )
  36.         ((= (cdr (assoc 70 ent)) 1) (setq pts (append pts (list (car pts)(cadr pts)))))
  37.     )
  38.   (setq  ent1 (entget ename))
  39.   (setq i 0)
  40.   (if (> (length pts) 2)
  41.     (progn
  42.       (repeat (-(length pts)2)
  43.         (setq pt1 (nth i pts) pt2 (nth (1+ i) pts) pt3 (nth (+ i 2) pts))
  44.         (if (equal (plzhexiang pt1 pt2 pt3) 0 1e-6)
  45.     (setq ent1 (vl-remove (cons 10 pt2) ent1)))
  46.         (setq i (1+ i))
  47.         )
  48.       (entmod ent1)
  49.       )
  50.     )
  51.   )
  52.       )
  53.     )
  54.   )
  55.       
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2015-9-1 09:36 | 显示全部楼层
fan_zh 发表于 2015-9-1 09:32
我发过一个多段线的优化程序,可以看我的贴

你的不是源码,看不到算法
回复 支持 1 反对 0

使用道具 举报

发表于 2018-5-22 22:31 | 显示全部楼层
有没有把曲线变圆滑一些的啊
发表于 2017-12-28 08:23 来自手机 | 显示全部楼层
overkill不是有定功能吗
发表于 2015-9-1 00:51 | 显示全部楼层
非关键点是什么意思,同一直线上的点都去掉,貌似你这个没考虑凸度吧,如果不考虑凸度的话,我觉得求交点就可以了。
 楼主| 发表于 2015-9-1 09:12 | 显示全部楼层
edata 发表于 2015-9-1 00:51
非关键点是什么意思,同一直线上的点都去掉,貌似你这个没考虑凸度吧,如果不考虑凸度的话,我觉得求交点就 ...

基本是这个意思,非关键点就是指非顶点上的点,我这个凸度没影响吧,只有同直线的才有影响,对同直线的线宽会有影响。
发表于 2015-9-1 09:32 | 显示全部楼层
我发过一个多段线的优化程序,可以看我的贴
发表于 2015-9-1 10:33 | 显示全部楼层
1去除直线段上中间的点:依次取1,2,3点,如果把2投影到13,距离为0,并且它在13之内,去掉2
2.折返点同上,如果2在13之外,去掉2
3.整合凸度,连续两点凸度值不为0且相等,只要第二点不是最后一点将其去掉?

最后,1,2两步是否能否综合。。。
发表于 2015-9-1 10:52 | 显示全部楼层
我 写了个多段线去重,可能跟你的差不多,出没有考虑线宽,凸度的的问题。其实要考虑也不复杂。见你用点积,应该是不错的程序了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2015-9-1 12:18 | 显示全部楼层
llsheng_73 发表于 2015-9-1 10:33
1去除直线段上中间的点:依次取1,2,3点,如果把2投影到13,距离为0,并且它在13之内,去掉2
2.折返点同上 ...

感谢回贴,凸度和线宽确实没有考虑,只要是在一条直线上的多余点全部去除了,不在同一直线上的凸度和线宽无影响。
 楼主| 发表于 2015-9-1 12:21 | 显示全部楼层
自贡黄明儒 发表于 2015-9-1 10:52
我 写了个多段线去重,可能跟你的差不多,出没有考虑线宽,凸度的的问题。其实要考虑也不复杂。见你用点积, ...

黄大师,我觉得主要是在更新对象表的时候复杂了,大师有没有好的方法?
发表于 2015-9-1 12:46 | 显示全部楼层
本帖最后由 llsheng_73 于 2015-9-1 13:02 编辑
springwillow 发表于 2015-9-1 12:21
黄大师,我觉得主要是在更新对象表的时候复杂了,大师有没有好的方法?


去除一个顶点的时候,需要连续去掉4个组。。。。相信这个不难
至于总点数,好象可以不用管它,基本上如果把数据分成3部分,10组之前的,第一个10组到最后一个42组之间的,最后的
再把中间部分4个一组,这样随便想去除哪个点都特别方便了,最后append起来后进行entmod就了事了
可以参考下
http://bbs.mjtd.com/forum.php?mo ... &fromuid=202795

另外凸度也是必须要考虑的,不然可能把连续几个曲线段弄成一个直线段导致彻底变形。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-25 17:01 , Processed in 0.238155 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表