llsheng_73 发表于 2020-1-14 16:44:56

本帖最后由 llsheng_73 于 2020-1-14 16:51 编辑

实际上这个图形它可以不是处于正交方向上,比如将它整体旋转过后。。。。另外也可以不是已知5个点,比如已知3个点,已知7个点....

mahuan1279 发表于 2020-1-14 20:33:46

本帖最后由 mahuan1279 于 2020-1-14 20:36 编辑

llsheng_73 发表于 2020-1-14 16:44
实际上这个图形它可以不是处于正交方向上,比如将它整体旋转过后。。。。另外也可以不是已知5个点,比如已 ...
如果图形是斜放着的,任意选三点,若果三点构成直角三角形,就找对角点(第四点),同时删除原三个角点;否则以三角形一顶点不动,先找到对角点,再删除另两点,剩余点集中任选三个合成第四个对角点(同时删除原三个点),最后形成一个点,关于原不动顶点的对称点就是所求点。

时见申 发表于 2020-1-14 21:19:20

谢谢,大神。我把我的明天也贴出来

时见申 发表于 2020-1-14 21:19:50

谢谢,大神。我把我的明天也贴出来

时见申 发表于 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)))))
)


时见申 发表于 2020-1-15 09:03:11

谢谢各位大神,我写这个函数的功能是为了写测绘的自动成图插件。我的思路是根据外业的编码,然后进行分类然后对这个分类后的乱的点集进行自动成图。现在已经写好了,测试也已经通过,谢谢各位大神的帮助。万分感谢。

mahuan1279 发表于 2020-1-15 09:09:25

mahuan1279 发表于 2020-1-14 20:33
如果图形是斜放着的,任意选三点,若果三点构成直角三角形,就找对角点(第四点),同时删除原三个角点; ...

经验证,此算法不正确。再好好想想。

xiangganglv 发表于 2020-1-15 09:09:38

为什么一定要用command,你这个完全可以用entmake

香远益清 发表于 2020-1-15 12:42:07

第4点:
第5点:nil

时见申 发表于 2020-1-15 14:01:45

香远益清 发表于 2020-1-15 12:42
第4点:
第5点:nil

请说清楚什么情况
页: 1 [2]
查看完整版本: 大神提供一个思路,求点