时见申 发表于 2020-1-10 19:51:12

大神提供一个思路,求点

已知5个点求第6个点。所有的内角都是直角。但是不确定缺失哪个点。

时见申 发表于 2020-1-15 08:59:21

本帖最后由 时见申 于 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:12:46

本帖最后由 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)
_$

时见申 发表于 2020-1-10 20:57:56

顶一下,别沉了,大神还没看到,千万别沉了

革天明 发表于 2020-1-10 21:30:33

求个包围盒,匹配一下就出来了
反向,把问题当成缺失一个点就行了

Bao_lai 发表于 2020-1-10 23:45:35

已经想到了一个简单思路,明天实操下。

fl202 发表于 2020-1-13 11:48:42

列举法,6个点分别缺失的情况下,把算法做下即可。

satan421 发表于 2020-1-13 11:53:44

革天明 发表于 2020-1-10 21:30
求个包围盒,匹配一下就出来了
反向,把问题当成缺失一个点就行了

他这可能只是其中的一种情况,猜测可能还有更复杂的情况

mahuan1279 发表于 2020-1-13 13:18:14

本帖最后由 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).

时见申 发表于 2020-1-13 14:35:40

谢谢各位大神提供思路,尤其mahuan1279,感谢

Bao_lai 发表于 2020-1-14 14:24:44

MJTD终于好了~
页: [1] 2
查看完整版本: 大神提供一个思路,求点