kele99kele 发表于 2015-8-7 15:47:59

如何已知点表做各点连线(有连线规则)

在已知点表的情况下,如何做各点的规则连线呢?我现在连思路都没有,请帮忙看看。点表的数量为随机,但是肯定能够组成一个相对规则的形状。

Gu_xl 发表于 2015-8-7 16:05:25

对点表进行排序即可!
水平方向的排序:
;;点自上而下,自左而右排序
      (setq pts (vl-sort pts '(lambda (a b) (if (equal (cadr a)(cadr b) 1e-3)(< (car a) (car b)) (> (cadr a)(cadr b))))))

      ;;点自左而右 自上而下排序
      (setq pts (vl-sort pts '(lambda (a b) (if (equal (car a)(car b) 1e-3)(> (cadr a) (cadr b)) (< (car a)(car b))))))
非水平方向的可先将点转换到水平方向,再排序,方法同上!

Gu_xl 发表于 2015-8-7 16:28:25

;;加载XLRX_API后使用:

(defun c:tt (/ SS N PTS PTS1 L Y PTS2 X diff)
(initget 4)
(setq diff (getreal "\n输入容差值<0.001>"))
(if (null diff) (setq diff 0.001))
(if (setq ss (ssget '((0 . "point"))))
    (progn
      (repeat (setq n (sslength ss))
        (setq pts
             (cons (cdr (assoc 10 (entget (ssname ss (setq n (1- n))))))
                     pts
             )
        )
      )
      (setq m       (XLRX-Mat-SetCoordSystem
                   (setq o (getpoint "\n基点:"))
                   (setq v (mapcar '- (getpoint o "\n方向:") o))
                   (XLRX-Vec-perpVec v)
               )
          invm (XLRX-Mat-Inverse m)
      )
      (setq pts (XLRX-Points-TransFormBy pts invm))
      ;;点自上而下,自左而右排序
      (setq pts1 (vl-sort pts
                          '(lambda (a b)
                             (if (equal (cadr a) (cadr b) diff)
                             (< (car a) (car b))
                             (> (cadr a) (cadr b))
                             )
                           )
               )
      )
      (while pts1
        (setq l           (list (car pts1))
              pts1 (cdr pts1)
              y           (cadar pts1)
        )
        (while (and pts1 (equal y (cadar pts1) diff))
          (setq        l    (cons (car pts1) l)
                pts1 (cdr pts1)
          )
        )
        (xlrx-make "lwpolyline" (XLRX-Points-TransFormBy l m))
      )

      ;;点自左而右 自上而下排序
      (setq pts2 (vl-sort pts
                          '(lambda (a b)
                             (if (equal (car a) (car b) diff)
                             (> (cadr a) (cadr b))
                             (< (car a) (car b))
                             )
                           )
               )
      )
      (while pts2
        (setq l           (list (car pts2))
              pts2 (cdr pts2)
              x           (caar pts2)
        )
        (while (and pts2 (equal x (caar pts2) diff))
          (setq        l    (cons (car pts2) l)
                pts2 (cdr pts2)
          )
        )
        (xlrx-make "lwpolyline" (XLRX-Points-TransFormBy l m))
      )
    )
)
)

kele99kele 发表于 2015-8-7 17:57:34

谢谢G版,我加到程序里试试看,热心的G版,32个赞

kele99kele 发表于 2015-8-7 18:11:01

经测试,已解决,可否解释下容差的作用呢?

Gu_xl 发表于 2015-8-7 19:51:19

kele99kele 发表于 2015-8-7 18:11
经测试,已解决,可否解释下容差的作用呢?

容差是指在同一水平线或垂直线的偏差

kele99kele 发表于 2015-8-7 21:35:58

Gu_xl 发表于 2015-8-7 19:51 static/image/common/back.gif
容差是指在同一水平线或垂直线的偏差

谢谢G版,看来我理解的没错

kele99kele 发表于 2015-8-7 21:59:15

仔细研究了程序,G版的思路简单明了,转轴——排序——x向连线——y向连线,今天回来晚,看了G版的代码后茅塞顿开。

陨落 发表于 2015-8-7 22:56:36

G版写过一个投影到圆上进行连线的程序,在特殊情况下可能会有用

陨落 发表于 2015-8-7 23:54:56

http://bbs.mjtd.com/thread-88065-1-1.html
页: [1] 2
查看完整版本: 如何已知点表做各点连线(有连线规则)