wowan1314 发表于 2014-7-23 11:29:29

【求助】环形排序 如何搞 ?

本帖最后由 wowan1314 于 2014-7-23 21:07 编辑

    想编个小程序。 突然发现 环形排序 弄不出!论坛搜索了半天没找到,可能隐藏太深,特来求助!

上传图片中 画箭头 的是我想要的效果!结果弄出来都是折返的。

我按自己的思路搞定了! 感谢各位热心回帖!

wowan1314 发表于 2014-7-23 21:05:12

搞定了!
我按如下思路进行的处理!
1、先折返排序 点表0
2、取出 点表0 的首位点 ,以此点确定一个区间,取出此区间内的点表1(区间大小应与折返排序一致)
3、继续取剩下的 点表0的首位点 ,再取出成点表2
如此循环,并且偶数的点表revese下,最后把 奇偶的点表合并!

写起来代码比较简单就不献丑了!如有其它更好算法 , 请回帖告知!敬谢。

效果如下:

langjs 发表于 2014-7-23 11:43:33

本帖最后由 langjs 于 2014-7-23 11:46 编辑

这个加上判断应该弄得出来啊。点表排序吗?好久不见

wowan1314 发表于 2014-7-23 11:56:51

本帖最后由 wowan1314 于 2014-7-23 11:58 编辑

langjs 发表于 2014-7-23 11:43 static/image/common/back.gif
这个加上判断应该弄得出来啊。点表排序吗?好久不见
好久不见!小弟愚钝啊! 想不明白咋弄!

难道是按区间分好 行或列 然后再按列或行 一正一反的排序? 感觉好麻烦啊!
而且区间不好确定啊!

自贡黄明儒 发表于 2014-7-23 11:59:37

本帖最后由 自贡黄明儒 于 2014-7-23 12:04 编辑

wowan1314 发表于 2014-7-23 11:56
好久不见!小弟愚钝啊! 想不明白咋弄!

难道是按区间分好 行或列 然后再按列或行 一正一反的排序? ...

你在开玩笑吧,还有你搞不定的
如果是多段线,你沿线就是你图示的样子。你想弄成什么效果

wowan1314 发表于 2014-7-23 12:10:43

自贡黄明儒 发表于 2014-7-23 11:59 static/image/common/back.gif
你在开玩笑吧,还有你搞不定的
如果是多段线,你沿线就是你图示的样子。你想弄成什么效果
本来就不擅长 编程!你没搞过环形排序的问题? 没有多段线,单纯的点表排序!


1、先折返排序 点表0
2、取出首位点 ,以此点确定一个区间,取出此区间内的点表1
3、继续取剩下的 点表0的首位 ,再取出成点表2
如此循环,然后偶数的点表revese下,最后把 奇偶的点表合并!

看是否有更简单的方法!?

ysq101 发表于 2014-7-23 12:16:51

自贡黄明儒 发表于 2014-7-23 11:59 static/image/common/back.gif
你在开玩笑吧,还有你搞不定的
如果是多段线,你沿线就是你图示的样子。你想弄成什么效果

哈哈,
葛老收刀也有大大大大半年了吧
都生锈了呵

xyp1964 发表于 2014-7-23 12:43:12

看不出来哪个是“环形排序”

xyp1964 发表于 2014-7-23 12:43:54

本帖最后由 xyp1964 于 2014-7-23 12:45 编辑

langjs 发表于 2014-7-23 13:32:30

编了一小段,上下来回折的点表排序好像是正确的,下面是测试程序
(defun c:tt (/ e1 e2 i lst lst1 pt)
(setq lst '()        lst1 '())
(while (setq pt (getpoint "\n点:"))
    (setq lst (cons pt lst))
)
(setq lst (vl-sort lst (function (lambda (e1 e2)(<= (cadr e1) (cadr e2)))))
        lst (vl-sort lst (function (lambda (e1 e2)(<= (car e1) (car e2)))))
        i 0
)
(repeat (length lst)
    (if (= (rem i 4) 0)
      (progn
        (if (nth (+ 1 i) lst)(setq lst1 (cons (nth (+ 1 i) lst) lst1)))
        (setq lst1 (cons (nth i lst) lst1))
        (if (nth (+ 2 i) lst)(setq lst1 (cons (nth (+ 2 i) lst) lst1)))
        (if (nth (+ 3 i) lst)(setq lst1 (cons (nth (+ 3 i) lst) lst1)))
      )
    )
    (setq i (1+ i))
)
(setq lst (reverse lst1))
(entmake (append
             (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(100 . "AcDbPolyline") (cons 90 (length lst)))
             (mapcar'(lambda (pt) (cons 10 pt)) lst)
           )
)
(princ)
)

q3_2006 发表于 2014-7-23 13:48:59

wowan1314 发表于 2014-7-23 12:10 static/image/common/back.gif
本来就不擅长 编程!你没搞过环形排序的问题? 没有多段线,单纯的点表排序!




我也只会用这个方法....所以只能应用于规格方阵....基本没有通用性.....
页: [1] 2
查看完整版本: 【求助】环形排序 如何搞 ?