明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 16985|回复: 33

[原创]精典排序函数:能根据X、Y条件对坐标表进行各种排序!(源代码哟)

  [复制链接]
发表于 2003-8-15 13:46:00 | 显示全部楼层 |阅读模式
[fly]能进行坐标点的排序!
你是想进行先X从上到下后Y从左到右
或是先X从下到上后Y从右到左
或是。。。。。。。。。。。。。。。
哈哈。。。。
通吃!!!!!
我吃。。。
我吃。。。。。。。。。。。。。。
。。。。。。。。。。。。。


---------------------------------------------------------------------------------
该函数是根据《明经通道》上的函数库中领悟而得
在此向明经通道致谢!!!!!!!!!![glow=255,red,2]文字[/glow]
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2003-8-15 13:48:00 | 显示全部楼层

本帖子中包含更多资源

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

x
发表于 2003-8-15 14:09:00 | 显示全部楼层
我才从“隔壁”过来,看到过  此文。
发表于 2003-8-15 15:40:00 | 显示全部楼层
不只怎么,从表中取出的<、>函数不能使用。
我也做了一个,增加两个功能,单独给x、y排序。
fun参数如下:
(0 < <)单独给X排序
(1 < <)单独给Y排序
(2 < <)先X后Y
(3 < <)先Y后X
  1. (defun sort(lst fun / a)
  2.   (defun des(e1 e2)
  3.     (if (= (cadr fun) '<)
  4.       (< (car e1) (car e2))
  5.       (> (car e1) (car e2))
  6.     )
  7.   )
  8.   (defun des2(e1 e2)
  9.     (if (= (caddr fun) '<)
  10.       (< (cadr e1) (cadr e2))
  11.       (> (cadr e1) (cadr e2))
  12.     )
  13.   )
  14.   (cond
  15.     ((= (car fun) 0) (vl-sort lst 'des))
  16.     ((= (car fun) 1) (vl-sort lst 'des2))
  17.     ((= (car fun) 2) (setq a (vl-sort lst 'des)) (vl-sort a 'des2))
  18.     ((= (car fun) 3) (setq a (vl-sort lst 'des2)) (vl-sort a 'des))
  19.   )
  20. )

发表于 2003-8-15 15:55:00 | 显示全部楼层
本帖最后由 作者 于 2003-8-15 17:31:07 编辑

这样就可以了
  1. (defun sort(lst fun / a)
  2.   (defun des(e1 e2)
  3.     ((eval (cadr fun)) (car e1) (car e2))
  4.   )
  5.   (defun des2(e1 e2)
  6.     ((eval (caddr fun)) (cadr e1) (cadr e2))
  7.   )
  8.   (cond
  9.     ((= (car fun) 0) (vl-sort lst 'des))
  10.     ((= (car fun) 1) (vl-sort lst 'des2))
  11.     ((= (car fun) 2) (setq a (vl-sort lst 'des)) (vl-sort a 'des2))
  12.     ((= (car fun) 3) (setq a (vl-sort lst 'des2)) (vl-sort a 'des))
  13.   )
  14. )
发表于 2003-8-15 23:59:00 | 显示全部楼层

  1. (defun sort-xy(li no / s-x s-y)
  2. (defun s-x (li )(vl-sort li '(lambda(x y)(< (car x)(car y)))))
  3. (defun s-y (li )(vl-sort li '(lambda(x y)(< (cadr x)(cadr y)))))
  4.   (cond((= no 0)(s-x li) )
  5.           ((= no 1)(s-y li ) )
  6.           ((= no 2) (s-x(s-y li)))
  7.           ((= no 3)(s-y(s-x li)))
  8.    )
  9. )

(sort-xy ptn 0) ...

其实不好,应该下面更好

  1. (defun sort-xy (li how / a)
  2. (if(setq a(car how))(setq li(vl-sort li '(lambda(x y)((eval a)(car x)(car y))))))
  3. (if(setq a(cadr how))(setq li(vl-sort li '(lambda(x y)((eval a)(cadr x)(cadr y))))))
  4. li
  5. )

(sort-xy li '(< >))  x:< y: >
(sort-xy li '(>))    x:>
(sort-xy li '(nil >))    y:>
(sort-xy li '(> >) ......
 楼主| 发表于 2003-8-18 15:08:00 | 显示全部楼层
调用:(NetBee_px slist (list 1 < >))
 楼主| 发表于 2003-8-18 15:13:00 | 显示全部楼层
调用:(NetBee_px slist (list 1 < >))
其中slist:((x y)(x y)(x y).........)
后面一个条件表,只能用list生成
发表于 2004-4-2 22:38:00 | 显示全部楼层
aeo000000发表于2003-8-15 23:59:00(defun sort-xy(li no / s-x s-y) (defun s-x (li )(vl-sort li '(lambda(x y)(< (car x)(car y))))) (defun s-y (li )(vl-sort li '(lambda(x y)(<...
其实,有一个概念我想跟大家说一下。前几次看到类似帖子的时候就想说了,但有次回复不成功,后来就算了。这回不知道正不正常,要是不能发,也就再不说了。 什么是对多维数组排序? 什么是先x,后y?这些和按x 或按y排序有何区别?看这个贴的朋友们你们自己都清楚么? 先看看 meflying 和aeo的例子 (setq lst '((0 1 0)(1 0 0)(0 1 1)(0 1 2)(1 0 1)(2 0 1)(0 2 2)))
(sort-xy lst '(nil <)) 返回:((1 0 0) (1 0 1) (2 0 1) (0 1 0) (0 1 1) (0 1 2) (0 2 2)) (sort-xy lst '(< <)) 返回(1 0 0) (1 0 1) (2 0 1) (0 1 0) (0 1 1) (0 1 2) (0 2 2)) (sort lst '(2 < <));先X后Y ->返回(1 0 0) (1 0 1) (2 0 1) (0 1 0) (0 1 1) (0 1 2) (0 2 2)) (sort lst '(1 < <));单独给Y排序 ->返回(1 0 0) (1 0 1) (2 0 1) (0 1 0) (0 1 1) (0 1 2) (0 2 2)) 不知道大家看明白没有:) 根本没有什么先x后y,或先y后x排序。先x后y的效果和按y排序是一样的,先y后x同理!返回结果都是按照fun中定义的表的最后一种方式排序,因此,先什么后什么的说法或那部分程序语句是多余的,一个美丽的光环而已。 什么是真正的先x后y排序? 那就是:多维数组中先按x排序,在x数值***相同***的元素中,再按照y排序。 好了,概念清楚了。程序也将呼之欲出了吧? :)
发表于 2004-4-2 23:16:00 | 显示全部楼层
本帖最后由 作者 于 2004-4-2 23:37:33 编辑

实在看不明白楼上说的到底是要说明什么问题,



如下图,假设列表是这个各自各交点的一个表,如果仅按Y排(从小到大),则结果可能会是:(3 1 2 4 6 5 7        8 9),而如果先按X排,再按Y排,则将得到(1 2 3 4 5 6 7 8 9)——用数字表示此处的点坐标。


你说的“多维数组中先按x排序,在x数值***相同***的元素中,再按照y排序”,则跟先按Y排,再按X排,结果是一样的...而同先X,再Y则不是一回事




本帖子中包含更多资源

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

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 17:25 , Processed in 0.204553 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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