找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1399|回复: 10

[讨论]:终于搞定了:有n(n为偶数)个点pt1,pt2,pt3,pt4,pt5,pt6......ptn,程序要使这n

[复制链接]
发表于 2006-11-6 22:55:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
由点的坐标组成表"plst" 中,使与第一个点距离最小的另一个点组成一个只有两个点的表.

  1. (defun c:t1 ()
  2.   (setq plst '((2000.0 0.0 0.0) (800.0 0.0 0.0) (500.0 0.0 0.0) (0.0 0.0 0.0)))
  3.   (ttt plst))
  4. (defun c:t2 ()
  5.   (setq plst '((500.0 0.0 0.0) (0.0 0.0 0.0) (2000.0 0.0 0.0) (800.0 0.0 0.0)))
  6.   (ttt plst))

  7. (defun ttt (plst / i n p1 p2 p3 d12 d13 plst1)
  8.   (setq        i 0
  9.         n (length plst)
  10.   )
  11.   (while (< i (- n 2))
  12.     (setq p1  (nth 0 plst)
  13.           p2  (nth 1 plst)
  14.           p3  (nth 2 plst)
  15.           d12 (distance p1 p2)
  16.           d13 (distance p1 p3)
  17.     )
  18.     (if        (> d12 d13)
  19.       (progn
  20.         ((setq plst (cons p1 (cddr plst)))
  21.           (setq plst1 (cons p2 plst1))
  22.         )
  23.       )
  24.       (progn (setq plst (cons p1 (cons p2 (cdddr plst))))
  25.              (setq plst1 (cons p3 plst1))
  26.       )
  27.     )
  28.     (setq i (1+ i))
  29.   )
  30.   (princ plst)
  31. (prin1)
  32. )

上面程序中"t1"运行正常,但"t2"不正常!
请高手点解,
WHY??
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-11-7 04:53:23 | 显示全部楼层
[php]
(defun c:test ()
  (setq plst '((2000.0 0.0 0.0) (800.0 0.0 0.0) (500.0 0.0 0.0) (0.0 0.0 0.0)))
  ;(setq plst '((500.0 0.0 0.0) (0.0 0.0 0.0) (2000.0 0.0 0.0) (800.0 0.0 0.0)))
  (mindis (car plst)(cdr plst))
)
(defun mindis (p0 pts)
  (setq i 0 dis 10e10)
  (while (< i (length pts))
    (if (< (distance p0 (nth i pts)) dis)
      (setq n i dis (distance p0 (nth i pts)))
    )
    (setq i (1+ i))
  )
  (list p0 (nth n pts))
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-7 14:49:45 | 显示全部楼层
"kohi "
你能不能把你的程序改下
使"plst"中的点以两点距离最小两两组成点对
输出结果格式如下:
((2000.0 0.0 0.0) (800.0 0.0 0.0) )((500.0 0.0 0.0) (0.0 0.0 0.0)))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-11-7 20:58:57 | 显示全部楼层
楼主的程序中,第一个progn后多了一对(),去掉那对括号就正常了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-11-8 02:38:19 | 显示全部楼层
2楼的程序是满足你开始说的“距离最小的另一个点组成一个只有两个点的表.“的要求。
不明白你在3楼说的“以两点距离最小两两组成点对“的准确含义是什么, 按我的理解, “两两组成点对“--- 结果应该是这样:
((2000.0 0.0 0.0) (800.0 0.0 0.0) )((800.0 0.0 0.0) (500.0 0.0 0.0))((500.0 0.0 0.0) (0.0 0.0 0.0))。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 25个

财富等级: 恭喜发财

发表于 2006-11-8 12:42:12 | 显示全部楼层
建议采用排序函数
(list (car ptlst)  (car ((vl-sort    '(lambda(e1 e2) (< (distance  (car ptlst) e1) (distance  (car ptlst) e2) ) (cdr ptlst))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-9 09:27:49 | 显示全部楼层
一楼的要求简单了点,现在对程序提出新要求:
有n(n为偶数)个点pt1,pt2,pt3,pt4,pt5,pt6......ptn,程序要使这n个点中每两个点距离最近点组成一个表。
例如有:六个点组成表list1(pt1,pt2,pt3,pt4,pt5,pt6), pt1与pt2的距离为d12=5,d13=6,d14=7,d15=8,d16=9,d23=1,d24=2,d25=3,d26=4,d34=10,
d35=11,d36=12,d45=13,d46=14,d56=15,其中d23上述所有距离中最
小,则pt2,pt3组成一个表(pt2 pt3),将p2,p3从表list1中去除,剩下的点
(pt1,pt4,pt5,pt6)再按距离最近原则进行两两成表。最终输出结果
((pt2 pt3)(pt1 pt4)(pt5 pt6))
不知我说清楚没有!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2006-11-9 10:54:26 | 显示全部楼层
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-9 16:59:36 | 显示全部楼层
谢谢eachy版主的指点,
请帮我看一下下面程序:

  1. (defun c:t1()
  2. (setq ptlst '((2000.0 0.0 0.0) (800.0 0.0 0.0) (500.0 0.0 0.0) (8100.0 0.0 0.0)(0.0 0.0 0.0)(8000.0 0.0 0.0)))
  3. (mlenpts ptlst))
  4. (defun mlenpts (ptlst / pt d maxd mind maxl minl p1p2lst)
  5.   (setq        minl   (list (car ptlst) (cadr ptlst))
  6.         maxd   0
  7.         mind   (apply 'distance minl)
  8. )
  9.   (while (> (length ptlst) 2)
  10.     (setq ptlst1 ptlst)
  11.     (while (setq pt        (car ptlst1)
  12.                  ptlst1        (cdr ptlst1)
  13.            )
  14.       (foreach n ptlst1
  15.         (setq d (distance n pt))
  16.         (cond ((< maxd d)
  17.                (setq maxd d
  18.                      maxl (list n pt)
  19.                )
  20.               )
  21.               ((> mind d)
  22.                (setq mind d
  23.                      minl (list n pt)
  24.                )
  25.               )
  26.         )
  27.       )
  28.     )
  29.     (list maxl minl)
  30.     (setq p1p2lst (cons minl p1p2lst))
  31.     (setq ptlst (vl-remove (car minl) ptlst))
  32.     (setq ptlst (vl-remove (cadr minl) ptlst))
  33.   )
  34.   (setq p1p2lst (cons ptlst p1p2lst))
  35.   (princ p1p2lst)
  36. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-11-9 20:35:45 | 显示全部楼层
不知所云,但我知道第二个while后缺少判断式。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-9 22:47:14 | 显示全部楼层
终于搞定了,谢谢大家的帮助!
现将最终成果共享之:

  1. (defun c:t1()
  2. (setq ptlst '((2000.0 0.0 0.0) (800.0 0.0 0.0) (500.0 0.0 0.0) (8100.0 0.0 0.0)(0.0 0.0 0.0)(8000.0 0.0 0.0)))
  3. (mlenpts ptlst))
  4. (defun mlenpts (ptlst / pt d maxd mind maxl minl p1p2lst)
  5.   (while (> (length ptlst) 2)
  6.     (setq minl         (list (car ptlst) (cadr ptlst))
  7.           mind         (apply 'distance minl)
  8.           ptlst1 ptlst
  9.     )
  10.     (while (setq pt        (car ptlst1)
  11.                  ptlst1        (cdr ptlst1)
  12.            )
  13.       (foreach n ptlst1
  14.         (setq d (distance n pt))
  15.         (cond ((> mind d)
  16.                (setq mind d
  17.                      minl (list n pt)
  18.                )
  19.               )
  20.         )
  21.       )
  22.     )
  23.     (setq p1p2lst (cons minl p1p2lst))
  24.     (setq ptlst (vl-remove (car minl) ptlst))
  25.     (setq ptlst (vl-remove (cadr minl) ptlst))
  26.   )
  27.   (setq p1p2lst (cons ptlst p1p2lst))
  28. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-18 04:45 , Processed in 0.219432 second(s), 49 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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