乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 38|回复: 12

[编程交流] [帮助]按di对列表点排序

[复制链接]

22

主题

326

帖子

185

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
243
发表于 2022-7-6 09:05:47 | 显示全部楼层 |阅读模式
我有一个点列表(x y z)。现在,我想从列表中的一个点(变量)开始绘制一条样线,转到下一个点,使该点到下一个点的距离为最小,然后重复直到结束
由于我的E很差,我在这里贴了一张照片。我收到了来自用户排序为列表的列表点
(1 2 3 4 5 6 7在屏幕上,现在我想重新排序,就像(1 2 6 7 8 5 4 3)
我尝试了一些循环,但在lisp中很难成为新手。请帮帮我,(可以用递归吗?)
100548p0i5cz3u6z83eeua.jpg
谢谢大家的阅读
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 09:15:16 | 显示全部楼层
这应该让你开始:
 
  1. (defun _SortPtListByDist  (ptList)
  2. ;; Argument: Point list
  3. ;; Returns: Point list, sorted by distance from first point
  4. (vl-load-com)
  5. (mapcar
  6.    '(lambda (x / ptList2)
  7.       (setq ptList2 (append (cdr x) ptList2)))
  8.    (vl-sort
  9.      (mapcar
  10.        '(lambda (x / pt ptlist2)
  11.           (setq ptlist2
  12.                  (append
  13.                    (cons
  14.                      (distance
  15.                        (cond
  16.                          (pt)
  17.                          ((setq pt (car ptList))))
  18.                        x)
  19.                      x)
  20.                    ptlist2)))
  21.        ptList)
  22.      '(lambda (x y)
  23.         (< (car x) (car y))))))

 
例子:
 
  1. (defun _GetPoints  (/ pt ptList)
  2. ;; Returns: Point list
  3. (while (/= nil (setq pt (getpoint)))
  4.       (setq ptList (cons pt ptList)))
  5. (reverse ptList))

 
  1. (_SortPtListByDist (_GetPoints))

 
希望这有帮助!
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 09:18:58 | 显示全部楼层
Mat,您可以通过以下方式减少排序过程。。。
 
  1. (defun sortMyNitchUp (pointlist)
  2. ((lambda (point) (cons point (vl-sort (cdr pointlist) '(lambda (a b) (< (distance point a) (distance point b))))))
  3.    (car pointlist)
  4. )
  5. ))
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 09:21:23 | 显示全部楼层
这将充满问题:
 
  1. [b][color=BLACK]([/color][/b]defun ptl2pol [b][color=FUCHSIA]([/color][/b]pl / fl mx md p1 p2 tp[b][color=FUCHSIA])[/color][/b]
  2. [b][color=FUCHSIA]([/color][/b]defun remove [b][color=NAVY]([/color][/b]expr lst[b][color=NAVY])[/color][/b][color=#8b4513];;;TonyT or VNesterowski[/color]
  3.    [b][color=NAVY]([/color][/b]apply 'append [b][color=MAROON]([/color][/b]subst nil [b][color=GREEN]([/color][/b]list expr[b][color=GREEN])[/color][/b] [b][color=GREEN]([/color][/b]mapcar 'list lst[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
  4. [b][color=FUCHSIA]([/color][/b]setq mx 0[b][color=FUCHSIA])[/color][/b]
  5. [b][color=FUCHSIA]([/color][/b]foreach p pl
  6.    [b][color=NAVY]([/color][/b]foreach v pl
  7.       [b][color=MAROON]([/color][/b]if [b][color=GREEN]([/color][/b]> [b][color=BLUE]([/color][/b]distance p v[b][color=BLUE])[/color][/b] mx[b][color=GREEN])[/color][/b]
  8.           [b][color=GREEN]([/color][/b]setq mx [b][color=BLUE]([/color][/b]distance p v[b][color=BLUE])[/color][/b] p1 p p2 v[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
  9. [b][color=FUCHSIA]([/color][/b]setq fl [b][color=NAVY]([/color][/b]list p1[b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
  10. [b][color=FUCHSIA]([/color][/b]setq pl [b][color=NAVY]([/color][/b]remove p1 pl[b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
  11. [b][color=FUCHSIA]([/color][/b]repeat [b][color=NAVY]([/color][/b]length pl[b][color=NAVY])[/color][/b]
  12.     [b][color=NAVY]([/color][/b]setq md [b][color=MAROON]([/color][/b]distance p1 p2[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  13.     [b][color=NAVY]([/color][/b]foreach v pl
  14.        [b][color=MAROON]([/color][/b]if [b][color=GREEN]([/color][/b]< [b][color=BLUE]([/color][/b]distance [b][color=RED]([/color][/b]car fl[b][color=RED])[/color][/b] v[b][color=BLUE])[/color][/b] md[b][color=GREEN])[/color][/b]
  15.            [b][color=GREEN]([/color][/b]setq md [b][color=BLUE]([/color][/b]distance [b][color=RED]([/color][/b]car fl[b][color=RED])[/color][/b] v[b][color=BLUE])[/color][/b]
  16.                  tp v[b][color=GREEN])[/color][/b][b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  17.     [b][color=NAVY]([/color][/b]setq fl [b][color=MAROON]([/color][/b]cons tp fl[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b]
  18.     [b][color=NAVY]([/color][/b]setq pl [b][color=MAROON]([/color][/b]remove tp pl[b][color=MAROON])[/color][/b][b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
  19. [b][color=FUCHSIA]([/color][/b]command [color=#2f4f4f]"_.PLINE"[/color][b][color=FUCHSIA])[/color][/b]
  20. [b][color=FUCHSIA]([/color][/b]foreach v [b][color=NAVY]([/color][/b]reverse fl[b][color=NAVY])[/color][/b]
  21.       [b][color=NAVY]([/color][/b]command v[b][color=NAVY])[/color][/b][b][color=FUCHSIA])[/color][/b]
  22. [b][color=FUCHSIA]([/color][/b]command [color=#2f4f4f]""[/color][b][color=FUCHSIA])[/color][/b]
  23. [b][color=FUCHSIA]([/color][/b]prin1[b][color=FUCHSIA])[/color][/b][b][color=BLACK])[/color][/b]

 
 
所有点必须在同一平面上
 
如果两个点与另一个点的距离相同怎么办?
 
举几个例子。
 
对于大型列表,这将非常缓慢。
 
HTH-David
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 09:28:58 | 显示全部楼层
效率不高,但这不是预期的结果吗:
 
  1. (defun sort ( lst / _sort )
  2. (defun _sort ( a b )
  3.    (if a (cons a (_sort (car (setq b (vl-sort b '(lambda ( c d ) (< (distance a c) (distance a d)))))) (cdr b))))
  4. )
  5. (_sort (car lst) (cdr lst))
  6. )

 
还是我误解了?
回复

使用道具 举报

22

主题

326

帖子

185

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
243
发表于 2022-7-6 09:35:19 | 显示全部楼层
哇,非常感谢大家。这都是我所期待的。太棒了我花了一天时间思考和编码,但和你在一起需要几个小时^^
再次感谢大家
 
@大卫,李:没问题
 
@alanjt,RenderMan:我用bellow列表进行了测试,觉得它包含一个mis
 
并制作一个pline:
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 09:39:22 | 显示全部楼层
实际上,David的算法给出了更好的结果,因为最佳顺序也取决于起点。
 
下面的列表是区分算法的一个很好的示例:
 
使用Alan/Renderman的方法:
 
100550orm1h71k4o7uakd8.png
 
以上代码:
 
100551y111ux61u4hxizzc.png
 
上面有David的代码:
 
100552qzl5l58nd5jooml4.png
 
这是选择正确的起点开始算法的结果。因此,我可以通过以下方法改进代码:
 
  1. (defun sort ( lst / _sort a b d e l p )
  2. (defun _sort ( a b )
  3.    (if a (cons a (_sort (car (setq b (vl-sort b '(lambda ( c d ) (< (distance a c) (distance a d)))))) (cdr b))))
  4. )
  5. (setq l (cdr lst)
  6.        d (distance (setq p (car lst)) (car l))
  7. )
  8. (while (setq a (car l))
  9.    (foreach b (setq l (cdr l))
  10.      (if (< d (setq e (distance a b))) (setq p a d e))
  11.    )
  12. )
  13. (_sort p (vl-remove p lst))
  14. )
现在导致:
 
100553q0rxztrq2errq0ll.png
 
但是,虽然更简洁,但由于其递归性质,我的可能远不如David的高效。
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 09:42:54 | 显示全部楼层
好吧,我想这就是我没有阅读线程,只看发布的代码得到的。英雄联盟
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 09:47:08 | 显示全部楼层
 
实际上,我根据OP指定的布局绘制点,并考虑了特定的点选择顺序(同样,根据OP)。
回复

使用道具 举报

22

主题

326

帖子

185

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
243
发表于 2022-7-6 09:53:58 | 显示全部楼层
@李:我试着从列表中的第一个点绘制pline(如果用户选择的不是第一个点,我会把它放在列表中^^)
所以你的第一种方法就是我需要的^^
我还写了一个方法来做同样的事情:
  1. 8

 
对于Lee post中的list,我希望它像(sort lst 0)和Lee method像(sort lst 10)。
这是“普通”方式,但我觉得它比其他方式快一点??它是?
 
附言:@RenderMen:OP的意思是??对不起,我的英文不太好,所以,我很难理解“缩写”(我用谷歌写任何字符)
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-7 08:15 , Processed in 0.403502 second(s), 75 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表