leeli 发表于 2024-9-4 16:32:18

求lisp处理方法

已知平面有限个点,用直线连接这些点,不能成环,使连接这点的线长度和最小。并绘出连接图。

mahuan1279 发表于 2024-9-4 16:32:19

leeli 发表于 2024-9-5 22:30
是的,无向有权最小生成树
(defun fp ()
    (setq sn (ssget ":N" '((0 . "point"))))
    (setq i 0 n (sslength sn) plst nil)
    (while (< i n)
      (setq plst (cons (cons (+ i 1) (cdr (assoc 10 (entget (ssname sn i))))) plst))
      (setq i (+ i 1))
    )
   (reverse plst)
)
(defun mindist (alst blst)
(setq dlst nil)
(foreach a alst
       (foreach b blst
            (setq dlst (cons (list (car a) (car b) (distance (cdr a) (cdr b)))dlst))
      )
)
(setq qlst (car (vl-sort dlst '(lambda(a b) (< (last a) (last b)) ) )))
qlst
)
(defun c:tt ()
   (setq ptlst (fp))
   (setq vlst (list (car ptlst)) rlst (cdr ptlst))
   (while (not (null rlst))
          (setq qlst (mindist vlst rlst))
          (command "line" (cdr (assoc (car qlst) vlst)) (cdr (assoc (cadr qlst) rlst)) "" )
          (setq vlst (cons (assoc (cadr qlst)rlst) vlst))
          (setq rlst (vl-remove (assoc (cadr qlst)rlst) rlst))
   )
)

highflybird 发表于 2024-9-5 17:43:01

你可能需要的是最小生成树的算法吧?

或者斯坦纳树?

qazxswk 发表于 2024-9-5 21:59:37

在论坛里搜索:点连线,看看有没有你想要的。

leeli 发表于 2024-9-5 22:30:09

highflybird 发表于 2024-9-5 17:43
你可能需要的是最小生成树的算法吧?

或者斯坦纳树?

是的,无向有权最小生成树

leeli 发表于 2024-9-12 11:08:40

mahuan1279 发表于 2024-9-4 16:32
(defun fp ()
    (setq sn (ssget ":N" '((0 . "point"))))
    (setq i 0 n (sslength sn) plst nil) ...

谢谢 我学习学习 ,我没想出来,都准备去弄VBA了:D-

leeli 发表于 2024-9-12 16:31:32

mahuan1279 发表于 2024-9-4 16:32
(defun fp ()
    (setq sn (ssget ":N" '((0 . "point"))))
    (setq i 0 n (sslength sn) plst nil) ...

最小树要数组算的!

mahuan1279 发表于 2024-9-12 17:04:07

leeli 发表于 2024-9-12 16:31
最小树要数组算的!

万物皆可表。

leeli 发表于 2024-9-12 18:04:08

mahuan1279 发表于 2024-9-12 17:04
万物皆可表。

我开始也是你这样写的 ,不对,还要考虑前面点的关系

mahuan1279 发表于 2024-9-12 18:17:47

leeli 发表于 2024-9-12 18:04
我开始也是你这样写的 ,不对,还要考虑前面点的关系

你看了最小生成树算法了吗?
页: [1]
查看完整版本: 求lisp处理方法