找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1191|回复: 16

[寻找]:有无精简的代码可以在一个坐标点表中找出距离最远或最近的两个点?

[复制链接]
发表于 2004-3-17 14:21:24 | 显示全部楼层 |阅读模式

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

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

×
有无精简的代码可以在一个坐标点表中找出距离最远或最近的两个点?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2004-3-17 15:25:39 | 显示全部楼层

Re: [寻找]:有无精简的代码可以在一个坐标点表中找出距离最远或最近的两个点?

最初由 mmmm 发布
[B]有无精简的代码可以在一个坐标点表中找出距离最远或最近的两个点? [/B]


你据个例子吧,写一个点表,然后说明下要求什么?

另外“精简”的含义是什么?你写出来过,认为不精简吗?如果是,你把你的代码贴到论坛来吧。免得朋友给你写个和你一样算法的代码。

另外,请说明下是什么应用需要这样的函数?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-18 22:14:44 | 显示全部楼层
他的意思可能是说:如果要局部放大一个图形的某一部分,就需要找一个最小与最大的坐标值,也就是说,左下角与右上角的坐标点,然后用zoom—w时,输入左下角与右上角坐标,局部放大。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-19 08:54:02 | 显示全部楼层

Re: [寻找]:有无精简的代码可以在一个坐标点表中找出距离最远或最近的两个点?

最初由 mmmm 发布
[B]有无精简的代码可以在一个坐标点表中找出距离最远或最近的两个点? [/B]


贴一个原始方法的程序, 不知是否"精简"?
[php]
(defun maxdispts (pts)
  (setq d0 0 n 0)
  (while (< n (length pts))
    (setq m 0)
    (while (< m (length pts))
      (setq d (distance (nth n pts)(nth m pts)))
      (if (and (/= d 0)(> d d0))
        (setq d0 d
              pl (list (nth n pts)(nth m pts)))
      )
      (setq m (1+ m))
    )
    (setq n (1+ n))
  )
  pl
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-19 12:48:10 | 显示全部楼层
[php]
;;测试程序--在屏幕取点后,画出最近/最远点的两条直线.
(defun c:test ( / pt ptlst)
  (setq opd (getvar "pdmode"))
  (setvar "pdmode" 3)
  (while (setq pt (getpoint "\n取点:"))
    (vl-cmdf ".point" pt)(setq ptlst (cons pt ptlst))
  )
  (mapcar '(lambda (x)(vl-cmdf ".line" (car x)(cadr x) "")) (mlenpts ptlst));'
  (setvar "pdmode" opd)
  (princ)
)
;;按照距离排序取点程序,得(距离最小两点 距离最大两点)表;-------------------陌生人2004.3
(defun mlenpts (ptlst / mpts)
  (mapcar '(lambda (x)
             (mapcar '(lambda (y)
              (if (not(equal x y))
                  (setq mpts (cons (list (distance x y) x y) mpts))
                        mpts (vl-sort mpts '(lambda (a b) (< (car a)(car b))))
                        mpts (list (car mpts)(last mpts)))
              );end if
             )ptlst)
            )ptlst)
  (list (cdr (car mpts))(cdr (last mpts)))
)
[/php]
用foreach再改写
[program]
;;测试程序--在屏幕取点后,画出最近/最远点的两条直线.
(defun c:test ( / pt ptlst)
  (setq opd (getvar "pdmode"))
  (setvar "pdmode" 3)
  (while (setq pt (getpoint "\n取点:"))
    (vl-cmdf ".point" pt)(setq ptlst (cons pt ptlst))
  )
  (mapcar '(lambda (x)(vl-cmdf ".line" (cadr x)(caddr x) "")) (mlenpts ptlst));'
  (setvar "pdmode" opd)
  (princ)
)
;;按照距离排序取点程序,得((距离 最近两点) (距离 最远两点))表;-------------------ok! 陌生人.2004.3
(defun mlenpts (ptlst / mpts)
  (foreach x ptlst
    (foreach y ptlst
      (if (not(equal x y))
          (setq mpts (vl-sort (cons (list (distance x y) x y) mpts) '(lambda (a b) (< (car a)(car b))))
                mpts (list (car mpts)(last mpts)))
      )
    )
  )mpts
)
[/program]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-4-5 22:06:56 | 显示全部楼层
[program]
用排序:  pts   pt
(vl-sort '(lambda(p1 p2)(<(distance pt p1)(distance pt p2)) )pts)  ;第一个,和最后一个.

不用排序:pts pt
(defun test(pts pt)
  (setq  ptmin(car pts)  ptmax ptmin
            dis1(distance pt ptmin) dis2 dis1)
(foreach p pts
    (setq dis(distance p pt) )
   (if(< dis dis1)(setq dis1 dis ptmin p))
   (if(> dis dis2)(setq dis2 dis ptmax p))
)
(list ptmin ptmax)
)

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

使用道具 举报

发表于 2004-4-6 03:09:38 | 显示全部楼层
是“在坐标点表中找出距离最远或最近的两个点”(已知条件只有一个:点表)
不是“在坐标点表中找出距离指定点pt最远或最近的两个点”(已知条件2个:点表+pt点)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-4-6 22:28:11 | 显示全部楼层 |阅读模式

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

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

×
陌生人:
我用你的程序改了一下。我猜测vl-sort函数的运行速度会比一般函数慢些,循环调用可能会影响速度的。

[php]
;;测试程序--在屏幕取点后,画出最近/最远点的两条直线.
(defun c:test ( / pt ptlst)
  (setq opd (getvar "pdmode"))
  (setvar "pdmode" 3)
  (while (setq pt (getpoint "\n取点:"))
    (vl-cmdf ".point" pt)(setq ptlst (cons pt ptlst))
  )
  (mapcar '(lambda (x)(vl-cmdf ".line" (car x)(cadr x) "")) (mlenpts ptlst));'
  (setvar "pdmode" opd)
  (princ)
)

(defun mlenpts (ptlst / mpts pt1 pt2)
  (while (setq pt1 (car ptlst) ptlst (cdr ptlst))
    (foreach pt2 ptlst
      (setq mpts (cons (list (distance pt1 pt2) pt1 pt2) mpts))
    )
  )
  (setq mpts (vl-sort mpts '(lambda (a b) (< (car a)(car b)))))
  (list (cdr (car mpts)) (cdr (last mpts)))
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-4-8 18:11:39 | 显示全部楼层
凑凑热闹
[php]
;;;|返回点表中距离最远的两点,PTS为点表
;;;|SNSJ 2004.4.8
(defun maxlst (pts / js i x tt jl ds)
(setq js 0 i 0)
(repeat (length pts)
(setq tt(nth i pts))
(mapcar '(lambda (x)
  (if(>(setq ds(distance tt x))js)
    (setq js ds jl (list x tt)))
             )pts
          )(setq i (1+ i))
             )jl
  )
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2004-4-8 18:30:47 | 显示全部楼层
看到这个题目想到了那个求选择集交点程序[PHP]
;;求点集距离最大两点  eachy 2004.4.8
;;             晓东CAD家园
(defun max2pt (pts / n1 n2 pl dis dis1 p1 p2 ptl)
  (setq        n1  0
        pl  (length pts)
        dis 0.
  )
  (while (< n1 (1- pl))
    (setq p1 (nth n1 pts)
          n2 (1+ n1)
    )
    (while (< n2 pl)
      (setq p2 (nth n2 pts))
      (setq dis1 (distance p1 p2))
      (if (> dis1 dis)
        (setq ptl (list p1 p2))
      )
      (setq dis        dis1
            n2        (1+ n2)
      )
    )
    (setq n1 (1+ n1))
  )
  ptl
)[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-4-9 00:13:18 | 显示全部楼层
我看错了:)

eachy的好些: n *(n-1)(n-2)...次。

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

使用道具 举报

发表于 2004-4-9 07:28:37 | 显示全部楼层
你还是看错了。841594改的也是,而且更巧妙
(while (setq pt1 (car ptlst) ptlst (cdr ptlst))
  (foreach。。。。
发一个纯lsp的,加入了841594和sn的部分代码

  1. (defun mlenpts (ptlst / pt d maxd mind maxl minl)
  2.   (setq minl (list (car ptlst)(cadr ptlst)) maxd 0 mind (apply 'distance minl))
  3.   (while (setq pt (car ptlst) ptlst (cdr ptlst))
  4.     (foreach n ptlst
  5.       (setq d (distance n pt))
  6.       (cond ((< maxd d)(setq maxd d maxl (list n pt)))
  7.             ((> mind d)(setq mind d minl (list n pt)))
  8.       )
  9.     )
  10.   )(list maxl minl)
  11. )
  12. ;;测试程序--在屏幕取点后,画出最近/最远点的两条直线.
  13. (defun c:test ( / pt ptlst)
  14.   (setq opd (getvar "pdmode"))
  15.   (setvar "pdmode" 3)
  16.   (while (setq pt (getpoint "\n取点:"))
  17.     (vl-cmdf ".point" pt)(setq ptlst (cons pt ptlst))
  18.   )
  19.   (mapcar '(lambda (x)(vl-cmdf ".line" (car x)(cadr x) "")) (mlenpts ptlst))
  20.   (setvar "pdmode" opd)
  21.   (princ)
  22. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 9个

财富等级: 恭喜发财

发表于 2005-12-10 02:05:48 | 显示全部楼层 |阅读模式

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

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

×
  1. (defun &maxdis (lst / dis n p1 p2)
  2.   (setq dis 0.0)
  3.   (repeat (- (length lst) 1)
  4.     (setq p1 (car lst) lst (cdr lst) n -1)
  5.     (repeat (length lst)
  6.       (setq p2 (nth (setq n (1+ n)) lst ))
  7.       (if (and p1 p2 (> (distance p1 p2) dis))
  8.         (setq dis (distance p1 p2))
  9.       )
  10.     )
  11.   )
  12.   dis
  13. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 2个

财富等级: 恭喜发财

发表于 2005-12-10 13:45:57 | 显示全部楼层
最初由 陌生人 发布
[B]你还是看错了。841594改的也是,而且更巧妙
(while (setq pt1 (car ptlst) ptlst (cdr ptlst))
  (foreach。。。。
发一个纯lsp的,加入了841594和sn的部分代码[code]
(defun mlenpts (ptlst / pt d maxd mind ... [/B]


如果点集正好组成一个矩形,则距离最小和最大的点各有两组.而程序只能求出一组.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 22:56 , Processed in 0.214878 second(s), 63 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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