明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: 时见申

[讨论] 大神提供一个思路,求点

[复制链接]
发表于 2020-1-14 16:44:56 | 显示全部楼层
本帖最后由 llsheng_73 于 2020-1-14 16:51 编辑

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2020-1-14 20:33:46 | 显示全部楼层
本帖最后由 mahuan1279 于 2020-1-14 20:36 编辑
llsheng_73 发表于 2020-1-14 16:44
实际上这个图形它可以不是处于正交方向上,比如将它整体旋转过后。。。。另外也可以不是已知5个点,比如已 ...

如果图形是斜放着的,任意选三点,若果三点构成直角三角形,就找对角点(第四点),同时删除原三个角点;否则以三角形一顶点不动,先找到对角点,再删除另两点,剩余点集中任选三个合成第四个对角点(同时删除原三个点),最后形成一个点,关于原不动顶点的对称点就是所求点。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 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)))))
)


回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-1-15 09:03:11 | 显示全部楼层
谢谢各位大神,我写这个函数的功能是为了写测绘的自动成图插件。我的思路是根据外业的编码,然后进行分类然后对这个分类后的乱的点集进行自动成图。现在已经写好了,测试也已经通过,谢谢各位大神的帮助。万分感谢。
发表于 2020-1-15 09:09:25 | 显示全部楼层
mahuan1279 发表于 2020-1-14 20:33
如果图形是斜放着的,任意选三点,若果三点构成直角三角形,就找对角点(第四点),同时删除原三个角点; ...

经验证,此算法不正确。再好好想想。
发表于 2020-1-15 09:09:38 | 显示全部楼层
为什么一定要用command,你这个完全可以用entmake
发表于 2020-1-15 12:42:07 | 显示全部楼层
第4点:
第5点:nil
 楼主| 发表于 2020-1-15 14:01:45 | 显示全部楼层

请说清楚什么情况
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-18 09:05 , Processed in 0.155459 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表