找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1046|回复: 11

[求助] [求助]:如何对坐标点排序?

[复制链接]
发表于 2003-6-17 21:22:33 | 显示全部楼层 |阅读模式

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

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

×
想请教各位高手:如何对所取得的一组坐标点进行排序,如((911.102 286.647 0.0) (795.308 271.554 0.0) (650.985 253.108 0.0) (474.777 264.847 0.0) (375.764 326.895 0.0) (285.143 387.266 0.0))
按X和Y分别排序(从小到大),取得二组点表,同时去掉重复的点,并且对X进行排序时去掉X值相同的点,对Y进行排序时去掉Y值相同的点。
请高手不吝赐教。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 593个

财富等级: 财运亨通

发表于 2003-6-17 21:44:51 | 显示全部楼层

Re: [求助]:如何对坐标点排序?

最初由 ykklms 发布
[B]想请教各位高手:如何对所取得的一组坐标点进行排序,如((911.102 286.647 0.0) (795.308 271.554 0.0) (650.985 253.108 0.0) (474.777 264.847 0.0) (375.764 326.895 0.0) (285.143 387.266 0.0))
按X和Y分别排?.. [/B]

xdrx_api中用于排序的几个函数。

  1. [color=blur]xdrx_realsort1[/color]

  2. 功    能:对给定的一组整(实数)从小到大排升序,省略重复项。

  3. 调用格式:(xdrx_realsort1 < 数1 > < 数2 > ... [数n])

  4. 返 回 值:返回排序后的表。

  5. 示    例:a='(3 4.6 56.0 2.1 4.6)
  6.             (apply 'xdrx_realsort1 a)
  7.             返回:(2.1 3.0 4.6 56.0)

  8. [color=blue]xdrx_realsort2[/color]

  9. 功    能:对给定的一组整(实数)从小到大排升序,不省略重复项。

  10. 调用格式:(xdrx_realsort2 < 数1 > < 数2 > ... [数n])

  11. 返 回 值:返回排序后的表。

  12. 示    例:a='(3 4.6 56.0 2.1 4.6)
  13.             (apply 'xdrx_realsort1 a)
  14.             返回:(2.1 3.0 4.6 4.6 56.0)

  15. [color=blue]xdrx_rlistdel1[/color]

  16. 功    能:根据关联表的索引值,把关联表中和给定的索引值相同的项删除。不省略重复项。凡是相等的都删除。

  17. 调用格式:(xdrx_rlistdel1 < 索引值 > < 关联表项1 > < 关联表项1 > ... [关联表项n])

  18. 返 回 值:返回表。

  19. 示    例:将关联表a='((3 "a" "b")(5 ("a" "c"))(3 (2 3)))中索引值为3的关联表项删除
  20.             (apply 'xdrx_rlistdel1 (cons 3 a))
  21.             返回值为:'((5 ("a" "c")))

  22. [color=blue]xdrx_rlistdel2[/color]

  23. 功    能:根据关联表的索引值,把关联表中和给定的索引值相同的项删除。省略重复项。只删除第一个相等的关联表项。

  24. 调用格式:(xdrx_rlistdel2 < 索引值 > < 关联表项1 > < 关联表项1 > ... [关联表项n])

  25. 返 回 值:返回表。

  26. 示    例:将关联表a='((3 "a" "b")(5 ("a" "c"))(3 (2 3)))中索引值为3的关联表项删除
  27.             (apply 'xdrx_rlistdel1 (cons 3 a))
  28.             返回值为:'((5 ("a" "c"))(3 (2 3)))

  29. [color=blue]xdrx_rlistsort1[/color]

  30. 功    能:根据关联表的索引值,把关联表从小到大排升序,省略重复项。

  31. 调用格式:(xdrx_rlistsort1 < 关联表项1 > < 关联表项1 > ... [关联表项n])

  32. 返 回 值:返回排序后的表。

  33. 示    例:a='((34.0 "a")(2.0 (2 3))(34 ("a" "b")))
  34.             (apply 'xdrx_rlistsort2 a)
  35.             返回值:((2.0 (2.0 3.0)) (34 ("a" "b")))

  36. [color=blue]xdrx_rlistsort2[/color]

  37. 功    能:根据关联表的索引值,把关联表从小到大排升序,不省略重复项。

  38. 调用格式:(xdrx_rlistsort2 < 关联表项1 > < 关联表项1 > ... [关联表项n])

  39. 返 回 值:返回排序后的表。

  40. 示    例:a='((34.0 "a")(2.0 (2 3))(34 ("a" "b")))
  41.             (apply 'xdrx_rlistsort2 a)
  42.             返回值:((2.0 (2.0 3.0)) (34 ("a" "b")) (34.0 "a"))
复制代码

还有一个更实用的

  1. xdrx_SortPointOnCurve

  2. 功    能:基于实体的点的排序函数,就是有一系列点是在曲线实体上,基于这个曲线实体,

  3.           从开始点到结束点排序这些实体上的点。结果是这些点依据实体的开始点开始排升序。

  4. 调用格式:(xdrx_SortPointOnCurve  < 曲线实体名 > ptl]

  5. 返 回 值:以曲线实体的开始参数为基点,排升序后的表。

  6. 例    子: 该函数在求一个曲线和其他所有曲线的交点的时候,很常用。
  7.             如:求一个已经的ARC和一些曲线实体的交点,然后为了下面的操作需要讲这些得到的交点
  8.                 排序,以前的做法是得到交点后,还需要根据某个特征,如求这些点到一个图形最小点
  9.                 的距离等等作为依据,排序。(这种方法的缺点就是若第一个曲线参数不是LINE,而是ARC
  10.                 等曲线,那么就非常不容易排序。现在有这个函数,问题就很好解决了。

  11.     (setq e (car (xdrx_entsel "\n请选取一个曲线实体:" '((0 . "*line,arc,ellipse")))));;得到一个曲线
  12.     (setq ptl (xdrx_getsamplept e)) ;;得到这个曲线的模拟顶点表
  13.     (setq ss (ssget "f" ptl '((0 . "*line,arc,ellipse")))) ;;得到所有和这个曲线相交的曲线实体到选择集ss
  14.     (setq ptl (xdrx_getinters e ss)) ;;得到曲线E和选择集中所有曲线的实际交点,不延伸。
  15.     (setq p (cons e ptl)) ;;构造基于实体排序的函数xdrx_SortPointOnCurve的参数表
  16.     (setq ptl (xdrx_sortpointoncurve e p)) ;;得到了排序后的点。

  17.     这些功能若不用XDRX_API,只用LISP,要用几十倍的代码量才能完成。

  18.     这些代码在求如建筑上轴网交点等等操作,极大的简化了代码量,速度还很快。

  19.     可以求任意实体的交点和排序。

XDRX_sortpointoncurve 的另外一个用法是用一个点表,不一定有实体 (xdrx_sortpointoncurve '(p1 p2) ptl),还有sortpointoncurve后面有个可选的参数T,如果给, 省略重复的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2003-6-17 22:45:34 | 显示全部楼层 |阅读模式

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

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

×
介绍个实例,就是刚刚写的几个水利工具,截取其中的排序部分。

  1. (while (setq e1 (xdrx_getentdata 0))
  2.   (setq hi (read (car (xdrx_getxdata e1 "YB_high"))));读取线的高度信息
  3.   (setq pint (xdrx_getinters e e1 0));等高线与剖线实体交点
  4.   (if (= (length pint) 1);一个交点时
  5.     (if        lst;构造点表 ((索引点 交点 高度) ... )
  6.       (setq lst
  7.              (append lst
  8.                      (list (append (list (mapcar 'fix (car pint)));取整数点后面用来作索引
  9.                                    pint;交点
  10.                                    (list hi);高程
  11.                            )
  12.                      )
  13.              )
  14.       )
  15.       (setq
  16.         lst (list (append (list (mapcar 'fix (car pint)))
  17.                           pint
  18.                           (list hi)
  19.                   )
  20.             )
  21.       )
  22.     )
  23.     (if        lst;两个交点情况
  24.       (setq
  25.         lst (append
  26.               lst
  27.               (list (list (mapcar 'fix (car pint))
  28.                           (car pint)
  29.                           hi
  30.                     )
  31.                     (list (mapcar 'fix (cadr pint))
  32.                           (cadr pint)
  33.                           hi
  34.                     )
  35.               )
  36.             )
  37.       )
  38.       (setq lst
  39.              (list
  40.                (list (mapcar 'fix (car pint)) (car pint) hi)
  41.                (list (mapcar 'fix (cadr pint))
  42.                      (cadr pint)
  43.                      hi
  44.                )
  45.              )
  46.       )
  47.     )
  48.   )
  49. )
  50. ;;对上面的点表沿剖线排序,用整数点沿剖线排序
  51. (setq
  52.   lst1 (mapcar '(lambda (x) (mapcar 'fix x))
  53.                (xdrx_sortpointoncurve e (mapcar 'cadr lst))
  54.        )
  55. )
  56. ;;根据排序取出实际的交点表
  57. (setq
  58.   lst (mapcar 'cdr
  59.               (mapcar '(lambda (x)
  60.                          (assoc x lst)
  61.                        )
  62.                       lst1
  63.               )
  64.       )
  65. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 593个

财富等级: 财运亨通

发表于 2003-6-17 22:54:42 | 显示全部楼层
再来一个实例,是写土方计算时用的,那时sortpointoncurve还没有

  1.   ;;对点表按x升序y降序排序,按行形成新的点表
  2.   (defun #sort_list (ptlist / ln mm pt_min l1 ll1 l2 ll l11)
  3.     (setq l1         nil
  4.           mm         (* 3e-4 (getvar "viewsize"))
  5.           pt_min (getvar "extmin")
  6.     )
  7.     (foreach ll        (mapcar 'car ptlist)
  8.       (setq ln (abs (xdrx_p2ldist ll pt_min (polar pt_min 0 1.0)))
  9.             l2 l1
  10.       )
  11.       (while (and (setq ll1 (car l2))
  12.                   (not (equal ln (car ll1) mm))
  13.              )
  14.         (setq l2 (cdr l2))
  15.       )
  16.       ;;将距离值近似的线段归入同一个子表内, 否则另开一个新的子表。
  17.       (setq l1 (if ll1
  18.                  (subst (append ll1 (list ll)) ll1 l1)
  19.                  (cons (list ln ll) l1)
  20.                )
  21.       )
  22.     )
  23.     ;;y坐标降序
  24.     (setq l11
  25.            (mapcar 'cdr (reverse (apply 'xdrx_rlistsort2 l1)))
  26.     )
  27.     ;;ll x升序 ((x1 y) (x2 y) ... )      第一行网格交点坐标
  28.     ;;          (x1' y1) (x2' y1) ...))  第二行网格交点坐标 .....
  29.     (setq ll
  30.            (mapcar '(lambda (x)
  31.                       (vl-sort x
  32.                                (function (lambda (e1 e2)
  33.                                            (< (car e1) (car e2))
  34.                                          )
  35.                                )
  36.                       )
  37.                     )
  38.                    l11
  39.            )
  40.     )
  41.     ll
  42.   )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-6-18 00:30:28 | 显示全部楼层
vl-sort本身是去掉重复项的

  1. ;x排序
  2. (vl-sort ptn '(lambda(x y)(< (car x)(car y))))
  3. ;y排序
  4. (vl-sort ptn '(lambda(x y)(< (cadr x)(cadr y))))

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

使用道具 举报

发表于 2003-6-18 03:59:11 | 显示全部楼层
5 楼:
vl-sort本身是不能去掉重复项的. 请看:(vl-sort '(2.0 1.3 2.4 1.3 3.4) '<)
返回: (1.3 1.3 2.0 2.4 3.4)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2003-6-18 07:43:09 | 显示全部楼层
在帖一个,忘了作者了(QF?)

  1. Sort_and_Write_pList :见附件
  2. (defun Sort_and_Write_pList (fname plist / fp pt)
  3.   ;; sort plist first
  4.   (setq plist (vl-sort plist
  5.        '(lambda (p1 p2)
  6.   (cond ((< (car p1) (car p2)) T)
  7. ((and (= (car p1) (car p2))
  8.       (< (cadr p1) (cadr p2))
  9. )
  10. T
  11. )
  12. ((and (= (car p1) (car p2))
  13.       (= (cadr p1) (cadr p2))
  14.       (< (caddr p1) (caddr p2))
  15. )
  16. T
  17. )
  18. (T nil)
  19.   )
  20. )
  21.       )
  22.   )
  23.   ;; write plist then
  24.   (setq fp (open fname "w"))
  25.   (foreach pt plist (princ pt fp) (princ "\n" fp))
  26.   (close fp)
  27. )

  28. ;;; 测试上述函数
  29. (Sort_and_Write_pList
  30.   "c:/test.txt"
  31.   '((1 3 4)
  32.     (2 4 5)
  33.     (3 4 5)
  34.     (1 3 2)
  35.     (3 5 2)
  36.     (2 4 0)
  37.     (1 2 3)
  38.     (1 2 0)
  39.     (1 1 0)
  40.    )
  41. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-6-18 10:22:31 | 显示全部楼层
最初由 lsjjm 发布
[B]5 楼:
vl-sort本身是不能去掉重复项的. 请看:(vl-sort '(2.0 1.3 2.4 1.3 3.4) '<)
返回: (1.3 1.3 2.0 2.4 3.4) [/B]

VL-SORT只对整数有效,可以根据小数点的位数获取,还是用XDAPI划算些:)

  1. (setq q '(2.0 1.3 2.4 1.3 3.4))
  2. (setq a (mapcar
  3.   '(lambda (x)
  4.      (fix(* x 10))   
  5.      )
  6.      q
  7.   ))
  8. (setq b (vl-sort a '<))
  9.      (mapcar
  10.      '(lambda (y)
  11.         (* y 0.1))
  12.      b
  13.      )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-6-19 09:45:47 | 显示全部楼层
与8楼商权:
(Vl-sort  表 关系式)的基本定义为: 对<表>的内容安照<关系式>的要求进行重新排序, 返回新表.
我只是说5 楼的."vl-sort本身是去掉重复项的" 不完全.
同样, 8楼的 "VL-SORT只对整数有效" 显而易见, 也不完全,
另看: (vl-sort (list "D" "A" "B" "A" "C") '<) 返回: ("A" "A" "B" "C" "D") 仍不消重.
点的坐标绝大多数情况下部是整数吧?
其实, 对坐标点的排序正是利用了vl-sort 函数的不消重, 否则相同坐标的点, 会丢掉的!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-6-20 23:19:01 | 显示全部楼层
vl-sort去掉重复项也只是可能,它的说明也这样说.
什么时候去掉了,只有autodesk才能说清楚:)
对坐标点排序,要判断两个实数相同,好象没个精确度不行.所以我说要再处理.
"对坐标点的排序正是利用了vl-sort 函数的不消重"正好符合了vl-sort的算法而已.它要给你去掉了,你也没办法,也只好将就.其实没vl-sort也排的很好.


(vl-sort  
   '(a d c b a)
   '(lambda (s1 s2)
     (< (vl-symbol-name s1) (vl-symbol-name s2)) ) )

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

使用道具 举报

发表于 2003-6-23 05:26:30 | 显示全部楼层
我看还是回到本贴的原问:"如何对坐标点排序?"这个出发点.
5楼和8 楼回答的完全与否, 大概不用费口舌了吧?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-2-7 00:00:27 | 显示全部楼层
[php]
(setq ptlst (vl-sort ptlst (function (lambda (e1 e2) (> (cadr e1) (cadr e2))))))
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-27 22:49 , Processed in 0.238611 second(s), 57 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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