乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 61|回复: 7

[编程交流] 多段线截取

[复制链接]

17

主题

40

帖子

23

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
85
发表于 2022-7-5 20:35:12 | 显示全部楼层 |阅读模式
如何知道多段线是否与自身相交。
非常感谢。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 20:45:42 | 显示全部楼层
这里有一种方法:
  1. ;; Polyline Self-Intersection  -  Lee Mac
  2. ;; Returns T if the supplied LWPolyline intersects itself
  3. (defun LM:polyselfintersect-p ( ent / lst obj )
  4.    (setq obj (vlax-ename->vla-object ent)
  5.          lst (mapcar '(lambda ( x ) (trans x ent 0)) (LM:groupbynum (vlax-get obj 'coordinates) 2))
  6.    )
  7.    (vl-some '(lambda ( x ) (not (vl-some '(lambda ( y ) (equal x y 1e-) lst)))
  8.        (LM:groupbynum (vlax-invoke obj 'intersectwith obj acextendnone) 3)
  9.    )
  10. )
  11. ;; Group by Number  -  Lee Mac
  12. ;; Groups a list into a list of lists, each of length 'n'
  13. (defun LM:groupbynum ( l n / r )
  14.    (if l
  15.        (cons
  16.            (reverse (repeat n (setq r (cons (car l) r) l (cdr l)) r))
  17.            (LM:groupbynum l n)
  18.        )
  19.    )
  20. )

要测试的程序:
  1. (defun c:test ( / ent )
  2.    (if (setq ent (car (entsel)))
  3.        (LM:polyselfintersect-p ent)
  4.    )
  5. )
回复

使用道具 举报

17

主题

40

帖子

23

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
85
发表于 2022-7-5 20:58:37 | 显示全部楼层
非常感谢李
回复

使用道具 举报

5

主题

956

帖子

963

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-5 21:02:36 | 显示全部楼层
 
李很好。LM:groupbynum
回复

使用道具 举报

4

主题

9

帖子

5

银币

初来乍到

Rank: 1

铜币
22
发表于 2022-7-5 21:16:36 | 显示全部楼层
你好
 
非常好的程序,如果T,我们能在自相交处创建一个点吗?
 
谢谢,李,做得很好。
回复

使用道具 举报

0

主题

375

帖子

385

银币

限制会员

铜币
-7
发表于 2022-7-5 21:19:07 | 显示全部楼层
Lee,如果多段线与顶点相交,则函数返回nil,但应为T。
一种方法是研究“intersectionwith”方法返回的每个点的曲线参数。
  1. (mapcar
  2. '(lambda (x) (vlax-curve-getparamatpoint ent x))
  3.   (LM:groupbynum (vlax-invoke obj 'intersectwith obj acextendnone) 3)
  4. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 21:27:02 | 显示全部楼层
 
非常感谢。
 
 
当然
  1. (defun c:test ( / ent lst obj sel )
  2.    (if (setq sel (ssget "_+.:E:S" '((0 . "LWPOLYLINE"))))
  3.        (progn
  4.            (setq ent (ssname sel 0)
  5.                  obj (vlax-ename->vla-object ent)
  6.                  lst (mapcar '(lambda ( x ) (trans x ent 0)) (LM:groupbynum (vlax-get obj 'coordinates) 2))
  7.            )
  8.            (foreach int (LM:groupbynum (vlax-invoke obj 'intersectwith obj acextendnone) 3)
  9.                (if (not (vl-some '(lambda ( vtx ) (equal int vtx 1e-) lst))
  10.                    (entmake (list '(0 . "POINT") (cons 10 int)))
  11.                )
  12.            )
  13.        )
  14.    )
  15.    (princ)
  16. )
  17. ;; Group by Number  -  Lee Mac
  18. ;; Groups a list into a list of lists, each of length 'n'
  19. (defun LM:groupbynum ( l n / r )
  20.    (if l
  21.        (cons
  22.            (reverse (repeat n (setq r (cons (car l) r) l (cdr l)) r))
  23.            (LM:groupbynum l n)
  24.        )
  25.    )
  26. )

 
谢谢
 
 
好的,Stefan,我承认我没有考虑过这种特殊的可能性——不过,我不确定检查交点的曲线参数是否是可行的解决方案,例如,考虑以下多段线的交点参数:
对于上述情况,我收到三个具有以下参数的交点:
  1. 5
回复

使用道具 举报

0

主题

375

帖子

385

银币

限制会员

铜币
-7
发表于 2022-7-5 21:41:44 | 显示全部楼层
我以为我已经全部检查过了,但显然没有。我也考虑过这种情况,但看起来我是按相反的顺序构建的。。。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-11 09:00 , Processed in 0.858085 second(s), 68 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表