乐筑天下

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

[编程交流] 选择点并连接

[复制链接]

2

主题

7

帖子

5

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 18:31:25 | 显示全部楼层 |阅读模式

                               
登录/注册后可看大图

大家好。。。
我试图构建一个lisp,可以用“ssget”从一个点连接到另一个点,但需要按前面提出的点进行连接,如何根据与第一个点的距离顺序选择一个点?有人知道吗?
 
提前感谢!
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:43:46 | 显示全部楼层
蛮力法=慢:
  1. (defun c:ptjoin ( / i l m p s )
  2.    (if (setq s (ssget '((0 . "POINT"))))
  3.        (progn
  4.            (repeat (setq i (sslength s))
  5.                (setq l (cons (cdr (assoc 10 (entget (ssname s (setq i (1- i)))))) l))
  6.            )
  7.            (if (setq p (getpoint "\nPick 1st point: "))
  8.                (progn
  9.                    (setq p (trans p 1 0))
  10.                    (while l
  11.                        (setq p (closestpoint p l)
  12.                              m (cons (cons 10 p) m)
  13.                              l (vl-remove p l)
  14.                        )
  15.                    )
  16.                    (entmake
  17.                        (append
  18.                            (list
  19.                               '(000 . "LWPOLYLINE")
  20.                               '(100 . "AcDbEntity")
  21.                               '(100 . "AcDbPolyline")
  22.                                (cons 90 (length m))
  23.                               '(070 . 0)
  24.                            )
  25.                            m
  26.                        )
  27.                    )
  28.                )
  29.            )
  30.        )
  31.    )
  32.    (princ)
  33. )
  34. (defun closestpoint ( p l / d q r x )
  35.    (setq r (car l)
  36.          d (distance p r)
  37.    )
  38.    (foreach q (cdr l)
  39.        (if (< (setq x (distance p q)) d)
  40.            (setq r q d x)
  41.        )
  42.    )
  43.    r
  44. )
回复

使用道具 举报

2

主题

7

帖子

5

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-5 18:51:57 | 显示全部楼层
谢谢你,李先生,这正是我所期望的。我将尝试把我创建的功能。再次感谢您一直以来的帮助。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 19:07:16 | 显示全部楼层
不客气!
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 19:12:18 | 显示全部楼层
使用纯lisp的Lee排序有点麻烦,vl排序有助于解决这个问题,它有一个列表(ptnum dist(x Y))(1 23(100 100))(2 25(23 23))(3 35(50 50)),因此pt2比pt1近,但pt3远。
 
我确实发现了这一点,这是我一直在寻找的其他东西,并将排序点非常快使用这种方法,这比使用while测试更容易。
 
  1. ; example from help
  2. (vl-sort '((1 3) (2 2) (3 1))
  3.             (function (lambda (e1 e2)
  4.                         (< (cadr e1) (cadr e2)))))
  5. ((3 1) (2 2) (1 3))   

 
我的测试
  1. (setq lst (list (list 1 23 (list 100 100))(list 2 22 (list 50 100))(list 3 35 (list 50 50))))
  2. (vl-sort lst
  3.    (function (lambda (e1 e2)
  4.    (< (cadr e1) (cadr e2)))))
  5. ; result
  6. ((2 22 (50 100)) (1 23 (100 100)) (3 35 (50 50)))
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 19:26:59 | 显示全部楼层
注意,不需要对点进行排序,因为我们只寻找最近的点,因此不需要按距离给定点距离的递增顺序对其余点进行排序。
 
还请注意,需要对处理的每个点执行此类排序,因为我们不是按与单个给定点的距离排序,而是按与每个连续点的距离排序(贪婪算法)。
 
整个任务本质上是最短路径问题,有几种著名的算法-注意,这里实现的贪婪算法不一定会产生最佳结果。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 19:31:51 | 显示全部楼层
李不用担心。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-12 13:23 , Processed in 0.472827 second(s), 70 queries .

© 2020-2025 乐筑天下

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