实际上这个图形它可以不是处于正交方向上,比如将它整体旋转过后。。。。另外也可以不是已知5个点,比如已知3个点,已知7个点....
本帖最后由 mahuan1279 于 2020-1-14 20:36 编辑
llsheng_73 发表于 2020-1-14 16:44
实际上这个图形它可以不是处于正交方向上,比如将它整体旋转过后。。。。另外也可以不是已知5个点,比如已 ...
如果图形是斜放着的,任意选三点,若果三点构成直角三角形,就找对角点(第四点),同时删除原三个角点;否则以三角形一顶点不动,先找到对角点,再删除另两点,剩余点集中任选三个合成第四个对角点(同时删除原三个点),最后形成一个点,关于原不动顶点的对称点就是所求点。
谢谢,大神。我把我的明天也贴出来 谢谢,大神。我把我的明天也贴出来 本帖最后由 时见申 于 2020-1-15 09:35 编辑
;lst为点集(有可能是一个不按顺序的乱点集),对lst重新排列。主要是我需要一个重新排列乱点集的子函数。所以就没有直接将计算出的拐点插到相应的位置。如果单单用计算第4个第6个第8个等拐点,这个函数算是通用的了。
(defun cass-jpt( lst / n fzjd pt1 xh2 xh3 pt2 pt3 ang1 ang2 ang) (setq lst (pts-makepl lst))
(setq n 0)
(setq fzjd '())
(repeat (length lst)
(setq pt1 (nth n lst))
(setq xh2 (+ 1 n) xh3 (+ 2 n))
(if (>= xh2 (length lst)) (setq xh2 (- (+ 1 n) (length lst))))
(if (>= xh3 (length lst)) (setq xh3 (- (+ n 2) (length lst))))
(setq pt2 (nth xh2 lst))
(setq pt3 (nth xh3 lst))
(setq ang1 (angle pt1 pt2))
(setq ang2 (angle pt2 pt3))
(setq ang (abs (- ang2 ang1)))
(if (or (equal (/ (* ang 180) pi) 90 0.2) (equal (/ (* ang 180) pi) 270 0.2))
nil
(setq fzjd (append fzjd (list pt2)))
)
(setq n (1+ n))
)
(cond
((and (= (vl-position (car fzjd) lst) 4) (= (vl-position (cadr fzjd) lst) 0))
(setq pt6 (J&G (nth (1- (vl-position (car fzjd) lst)) lst) (car fzjd) (cadr fzjd)))
)
((< (vl-position (car fzjd) lst) (vl-position (cadr fzjd) lst))
(setq pt6 (J&G (nth (1- (vl-position (car fzjd) lst)) lst) (car fzjd) (cadr fzjd)))
)
((and (= (vl-position (car fzjd) lst) 1) (= (vl-position (cadr fzjd) lst) 0))
(setq pt6 (J&G (nth (1+ (vl-position (car fzjd) lst)) lst) (car fzjd) (cadr fzjd)))
)
)
)
(defun J&G(p1 p2 p);计算拐直角点:从起始直线段p1,p2出发,拐直角到P,返回拐点(73哥函数)
(trans(cons(car(trans p 0(setq p1(mapcar'- p2 p1))))(cdr(trans p2 0 p1)))p1 0)
)
;对点集进行排序获得排序后的点集,改写mahuan1279大神在晓东的函数
(defun pts-makepl( plst / plst-xmax plst-ymax plst-xz plst-yz pt ptlst)
; (setq sn (ssget ":N" '((0 . "point"))))
; (setq i 0 n (sslength sn) plst nil)
;;获得点集合
; (while (< i n)
; (setq plst (cons (cdr (assoc 10 (entget (ssname sn i)))) plst))
; (setq i (+ i 1))
; )
;点集合进行X排序
(setq plst-xmax (vl-sort plst '(lambda (a b) (>=(car a) (car b)))))
;点集合进行Y排序
(setq plst-ymax (vl-sort plst '(lambda (a b) (>=(cadr a) (cadr b)))))
;获得前三个点的X值
(setq plst-xz (list (car (car plst-xmax)) (car (cadr plst-xmax)) (car (caddr plst-xmax))))
;获得前三个点的Y值
(setq plst-yz (list (cadr (car plst-ymax)) (cadr (cadr plst-ymax)) (cadr (caddr plst-ymax))))
;;获得点集的内部一点p
(setq pt (list (/(apply '+ plst-xz) 3) (/(apply '+ plst-yz) 3)))
;获得列表内的点与p点的方位角、距离及点的第一个和第二个元素,并且形成列表
(setq ptlst (mapcar '(lambda (p) (list (angle pt p) (distance pt p) (car p) (cadr p))) plst))
;对于点集进行排序,排序规则为方位角=(car x)有小到大如果相等按照距离有小到大
(setq pplst (vl-sort ptlst '(lambda (a b)
(if(= (car a) (car b))
(>= (cadr a) (cadr b))
(< (car a) (car b))
)
)
)
)
(setq pts (mapcar '(lambda (c) (cdr (cdr c))) pplst))
;(apply 'command (cons "pline" (reverse (cons "c" (reverse pts)))))
)
谢谢各位大神,我写这个函数的功能是为了写测绘的自动成图插件。我的思路是根据外业的编码,然后进行分类然后对这个分类后的乱的点集进行自动成图。现在已经写好了,测试也已经通过,谢谢各位大神的帮助。万分感谢。 mahuan1279 发表于 2020-1-14 20:33
如果图形是斜放着的,任意选三点,若果三点构成直角三角形,就找对角点(第四点),同时删除原三个角点; ...
经验证,此算法不正确。再好好想想。 为什么一定要用command,你这个完全可以用entmake 第4点:
第5点:nil 香远益清 发表于 2020-1-15 12:42
第4点:
第5点:nil
请说清楚什么情况
页:
1
[2]