明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1594|回复: 4

[函数] 点表的“自然排序”,人容易理解,电脑理解就难了

[复制链接]
发表于 2015-2-23 11:50 | 显示全部楼层 |阅读模式
本帖最后由 革天明 于 2015-2-23 11:52 编辑

对于点表,我们可以按X,Y排序,可是在不知道如何排序的条件下,想对点表进行排序好像有点困难,下面我贴出我的困惑,请大家指点一下如何才能解出这个问题:


对于左侧点,想以这些点组成的“趋势”来进行排序,上图所示8个点,放大了看,基本在135度线上,想实现的就是以点到“拟合线”上的垂足为排序点。如果拟合线为曲线,也是如此排序。
这种排序方法对人来说比较好理解,但对于lisp来说,不太容易做到,之前想到使用拟合的方法,拟合出“趋势线”,然后求点到曲线的垂足,然后计算此点到拟合曲线的起点的距离的方法来排序,但曲线拟合不太容易,此路就没有继续走下去。

e派给出的方法是求点集的凸包,然后根据凸包生成一条线,然后以曲线上距指定点最近点,到曲线起点的距离来排序,一般情况下程序能正确运行,但经过测试发现有bug,请各位指正。


图中以红点标示的三条线所得排序方法有问题,下面是样图


下面是e派的代码,需要e派工具箱的支持
;; tt(点集9pt码排序连线)
(defun c:tt ()
  (xyp-Start)
  (if (setq ss (ssget '((0 . "point"))))
    (setq ptn (mapcar '(lambda (x) (xyp-DXF 10 x)) (xyp-ss2list ss))
          ptn (xyp-Ptn9PtSort ptn 7 3)
          s2  (xyp-Pline ptn nil)
    )
  )
  (xyp-End)
)

;; xyp-Ptn9PtSort 点集9pt码排序表 (xyp-Ptn9PtSort ptn mode1 mode2)
(defun xyp-Ptn9PtSort (ptn 9pt1 9pt2 / s0 s1 pt)
  (setq        s0  (xyp-Get-Chimb ptn)
        s1  (xyp-line (xyp-9pt s0 9pt1) (xyp-9pt s0 9pt2))
        s0  (xyp-SubUpd s0 60 1)
        s1  (xyp-SubUpd s1 60 1)
        ptn (mapcar '(lambda (x)
                       (setq pt (vlax-curve-getclosestpointto s1 x))
                       (list (xyp-LengthAtPoint s1 pt) x)
                     )
                    ptn
            )
        ptn (vl-sort ptn '(lambda (x y) (< (car x) (car y))))
  )
  (xyp-erase (list s0 s1))
  (mapcar 'cadr ptn)
)

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2015-2-23 12:57 | 显示全部楼层
点集9pt码排序连线

本帖子中包含更多资源

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

x
发表于 2015-2-23 13:03 | 显示全部楼层
  1. ;; tt(点集9pt码排序连线)
  2. (defun c:tt ()
  3.   (xyp-Start)
  4.   (if (setq ss (ssget '((0 . "point"))))
  5.     (setq ptn  (mapcar '(lambda (x) (xyp-DXF 10 x)) (xyp-ss2list ss))
  6.           p7   (xyp-9pt ss 7)
  7.           p1   (xyp-9pt ss 1)
  8.           ptn1 (xyp-Sort-PtnByXYZ ptn)
  9.           pt   (car ptn1)
  10.           ptn  (if (< (distance p1 pt) (distance p7 pt))
  11.                  (xyp-Ptn9PtSort ptn 1 9)
  12.                  (xyp-Ptn9PtSort ptn 7 3)
  13.                )
  14.           s2   (xyp-Pline ptn nil)
  15.     )
  16.   )
  17.   (xyp-End)
  18. )
 楼主| 发表于 2015-2-23 16:37 | 显示全部楼层
xyp1964 发表于 2015-2-23 13:03

谢谢,成功了,加个判断就可以了
发表于 2015-2-24 00:50 | 显示全部楼层
碰到过没有解决的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-20 00:45 , Processed in 0.353822 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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