如何已知点表做各点连线(有连线规则)
在已知点表的情况下,如何做各点的规则连线呢?我现在连思路都没有,请帮忙看看。点表的数量为随机,但是肯定能够组成一个相对规则的形状。对点表进行排序即可!
水平方向的排序:
;;点自上而下,自左而右排序
(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))))))
非水平方向的可先将点转换到水平方向,再排序,方法同上! ;;加载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))
)
)
)
)
谢谢G版,我加到程序里试试看,热心的G版,32个赞 经测试,已解决,可否解释下容差的作用呢? kele99kele 发表于 2015-8-7 18:11
经测试,已解决,可否解释下容差的作用呢?
容差是指在同一水平线或垂直线的偏差 Gu_xl 发表于 2015-8-7 19:51 static/image/common/back.gif
容差是指在同一水平线或垂直线的偏差
谢谢G版,看来我理解的没错 仔细研究了程序,G版的思路简单明了,转轴——排序——x向连线——y向连线,今天回来晚,看了G版的代码后茅塞顿开。 G版写过一个投影到圆上进行连线的程序,在特殊情况下可能会有用 http://bbs.mjtd.com/thread-88065-1-1.html
页:
[1]
2