明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 天天问

多段线顶点过滤/顶点删除(多段线可以带圆弧)—源码分享(4月22日更新)

  [复制链接]
发表于 2022-4-6 12:38 | 显示全部楼层
假如我矩形线上有多余的顶点的话,怎么去优化掉?
 楼主| 发表于 2022-4-6 14:37 | 显示全部楼层
Q晋胡 发表于 2022-4-6 12:38
假如我矩形线上有多余的顶点的话,怎么去优化掉?

测试了一下,矩形是封闭多段线,用这个命令处理,也能处理边上共线的多余顶点,但是最终的多段线会不闭合。您这个需求,用专门针对矩形多余顶点来处理会好一点。
发表于 2022-4-6 15:04 | 显示全部楼层
天天问 发表于 2022-4-6 14:37
测试了一下,矩形是封闭多段线,用这个命令处理,也能处理边上共线的多余顶点,但是最终的多段线会不闭合 ...

为什么我测试显示,(错误;除数为零)而且就算不是矩形,但是转折90度以后也不行,只能是一条直线多余点才能成功
 楼主| 发表于 2022-4-6 16:37 | 显示全部楼层
Q晋胡 发表于 2022-4-6 12:38
转折的多段线不能优化顶点吗?

我发的这个是可以优化的,刚刚我也测试过。只是会遇到我上面说的那个问题。
对于不封闭的多段线就正常使用,对于矩形这种闭合多段线,就出现减点以后起点和终点不闭合的情况。
 楼主| 发表于 2022-4-6 16:40 | 显示全部楼层
Q晋胡 发表于 2022-4-6 15:04
为什么我测试显示,(错误;除数为零)而且就算不是矩形,但是转折90度以后也不行,只能是一条直线多余点 ...

如果遇到除数为0的错误,是因为三点共线的检测有个BUG。使用下面的这个函数替换之前的函数。
        (defun ff:3pt_in_line (p1 p2 p3 ang1 / boln  v1 v2 )
                (setq boln nil)
                (setq v1 (mapcar '- p1 p2)   v2 (mapcar '- p2 p3))
               
                (if (and
                                        (equal (car v1) 0 1e-4)
                                        (equal (car v2) 0 1e-4)
                                )
                        (setq boln T)        ;当x1-x2=0,且x2-x3=0时,证明p1p2p3三点共线,且该线平行于y轴(斜率无穷大)
                )
               
                (if (and
                                        (/= (car v1) 0)
                                        (/= (car v2) 0)
                                        (equal   (/ (cadr v1) (car v1))    (/ (cadr v2) (car v2))    (/ (sin (angtof ang1)) (cos (angtof ang1))))
                                )
                        (setq boln T)        ;当x1-x2≠0,且x2-x3≠0,且直线p1p2与直线p2p3的斜率在容差范围内相等时,证明p1p2p3三点共线。此处equal的容差取值为tanA
                )
                boln
        )


        (defun ff:check_3pt_in_line (p1 p2 p3 ang1 / boln  v1 v2 )
                (setq boln nil)
                (setq v1 (mapcar '- p1 p2)   v2 (mapcar '- p2 p3))
               
                (if (and
                                        (equal (car v1) 0 1e-4)
                                        (equal (car v2) 0 1e-4)
                                )
                        (setq boln T)        ;当x1-x2=0,且x2-x3=0时,证明p1p2p3三点共线,且该线平行于y轴(斜率无穷大)
                )
               
                (if (and
                                        (/= (car v1) 0)
                                        (/= (car v2) 0)
                                        (equal   (/ (cadr v1) (car v1))    (/ (cadr v2) (car v2))    (/ (sin (angtof ang1)) (cos (angtof ang1))))
                                )
                        (setq boln T)        ;当x1-x2≠0,且x2-x3≠0,且直线p1p2与直线p2p3的斜率在容差范围内相等时,证明p1p2p3三点共线。此处equal的容差取值为tanA
                )
                boln
        )       
发表于 2022-4-6 18:00 | 显示全部楼层
天天问 发表于 2022-4-6 16:40
如果遇到除数为0的错误,是因为三点共线的检测有个BUG。使用下面的这个函数替换之前的函数。
        (defun ff ...

能给个完成的函数吗?(新人,因为不知道之前的函数从哪里开始替换)
 楼主| 发表于 2022-4-6 20:01 | 显示全部楼层
Q晋胡 发表于 2022-4-6 18:00
能给个完成的函数吗?(新人,因为不知道之前的函数从哪里开始替换)

可以的,方便的话给我个邮箱,我发给你
发表于 2022-4-9 00:34 | 显示全部楼层
 楼主| 发表于 2022-4-9 15:39 | 显示全部楼层

已经发送,请注意查收
发表于 2022-4-26 22:55 来自手机 | 显示全部楼层
挺好的程序感谢楼主分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-4 12:02 , Processed in 0.243975 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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