大神提供一个思路,求点
已知5个点求第6个点。所有的内角都是直角。但是不确定缺失哪个点。本帖最后由 时见申 于 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-13 21:42 编辑
_$ (setq pts '((0 1)(0 2)(2 2)(1 0)(2 0)))
(setq lstx (mapcar 'car pts))
(setq lsty (mapcar 'cadr pts))
(list
(last (car (vl-remove nil
(mapcar '(lambda (y) (if (= (car y) 0) nil y))
(mapcar '(lambda (x) (list (rem (- (length lstx) (length (vl-remove x lstx))) 2) x))
(vl-sort lstx '<)
)
)
)
)
)
(last (car (vl-remove nil
(mapcar '(lambda (y) (if (= (car y) 0) nil y))
(mapcar '(lambda (x) (list (rem (- (length lsty) (length (vl-remove x lsty))) 2) x))
(vl-sort lsty '<)
)
)
)
)
)
)
((0 1) (0 2) (2 2) (1 0) (2 0))
(0 0 2 1 2)
(1 2 2 0 0)
(1 1)
_$ (setq pts '((0. 1.)(0. 2.)(2. 2.)(2. 0.)(1. 0.)))
(setq lstx (mapcar 'car pts))
(setq lsty (mapcar 'cadr pts))
(list
(last (car (vl-remove nil
(mapcar '(lambda (y) (if (= (car y) 0) nil y))
(mapcar '(lambda (x) (list (rem (- (length lstx) (length (vl-remove x lstx))) 2) x))
(vl-sort lstx '<)
)
)
)
)
)
(last (car (vl-remove nil
(mapcar '(lambda (y) (if (= (car y) 0) nil y))
(mapcar '(lambda (x) (list (rem (- (length lsty) (length (vl-remove x lsty))) 2) x))
(vl-sort lsty '<)
)
)
)
)
)
)
((0.0 1.0) (0.0 2.0) (2.0 2.0) (2.0 0.0) (1.0 0.0))
(0.0 0.0 2.0 2.0 1.0)
(1.0 2.0 2.0 0.0 0.0)
(1.0 1.0)
_$
顶一下,别沉了,大神还没看到,千万别沉了 求个包围盒,匹配一下就出来了
反向,把问题当成缺失一个点就行了 已经想到了一个简单思路,明天实操下。 列举法,6个点分别缺失的情况下,把算法做下即可。 革天明 发表于 2020-1-10 21:30
求个包围盒,匹配一下就出来了
反向,把问题当成缺失一个点就行了
他这可能只是其中的一种情况,猜测可能还有更复杂的情况 本帖最后由 mahuan1279 于 2020-1-13 14:15 编辑
其实就是(a,b)(b,c)(c,d)……(z,a),每个数值重复两遍,把已知的所有点合并,删掉偶数次重复的。例如,令图中的点坐标为(01)(02)(22)(2 0 )(10),则X点集合(0 0 2 2 1),只有1未配对;Y集合点为(1 2 2 0 0),只有1未配对,故缺少的点为(1,1).
谢谢各位大神提供思路,尤其mahuan1279,感谢 MJTD终于好了~
页:
[1]
2