明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2394|回复: 10

谁能求出所有不重合的两点中最小的距离

  [复制链接]
发表于 2012-4-20 14:49:04 | 显示全部楼层 |阅读模式
有多条线,每条线有两个端点,有可能端点是重合的,谁能求出所有不重合的两点中最小的距离
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2012-4-20 15:08:57 | 显示全部楼层
发表于 2012-4-20 20:25:40 来自手机 | 显示全部楼层
任意两点还是限定直线两端点?
 楼主| 发表于 2012-4-21 07:15:38 来自手机 | 显示全部楼层
是多条直线的两点,不是直线的最小距离,是端点距
 楼主| 发表于 2012-4-23 12:12:23 | 显示全部楼层
我试用了highflybir 的那个,速度是很快,但是我试用了几个都没求对
 楼主| 发表于 2012-5-9 11:27:58 | 显示全部楼层
我用高highflybir 的那个改了两点
一是将选择点改成了选择线的端点,二是将点重合的去掉
修改后,发现并不能求的最近的点,哪们大侠给看看
(defun C:te ();;(/ olderr en errmsg oldmode oce sl ss t0 ptlist pp pp1)
  ;;定义错误函数和预处理
  (setvar "errno" 0)
;  (setq olderr *error*)
;  (defun *error* (msg)
;    (setq en (getvar "errno"))
;    (setq errmsg (strcat "errno=" (itoa en) "\nError:" msg))
;    (alert errmsg)
;    (setq *error* olderr)
;  )
  (graphscr)
  (setq oldmode (getvar "osmode"))
  (setq oce (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (command ".ucs" "W")
  ;;也可以用其他方式取得点集
  ;(setq        sl '((0 . "POINT")))
  (setq t0 (getvar "TDUSRTIMER"))
  (SETQ myobj1 nil)
  (SETQ ss nil)
  (while (not ss)
     (princ "\n选择所有需要输入的直线...")
     (setq ss (ssget '((0 . "LINE,SPLINE,ARC,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE")))))
  (setq ptlist (getpt ss))
  (setq ptlist (sortx ptlist))
  (setq pp1 (f2 ptlist))
  (princ pp1)
;  (if (= nil pp)
;    (progn
;      (alert "不存在有最小距离的一对点!")
;      (command ".ucs" "p")
;      (setvar "osmode" oldmode)
;      (setvar "cmdecho" oce)
;      (princ)
;    )
;    (progn
;      ;;画最短距离的点对集的连线,可能有多条
;      (setvar "osmode" 0)
;      (foreach nn pp
;        (entmake
;          (append
;            '((0 . "line")(100 . "AcDbEntity")(100 . "AcDbLine"))
;            (list (cons 10 (car  nn)))
;            (list (cons 11 (cadr nn)))
;            (list (cons 62 1))
;          )
;        )
;      )
;      (command ".ucs" "P")
;      (setvar "osmode" oldmode)
;      (setvar "cmdecho" oce)
;      (princ)
;    )
;  )
)
;;取点函数,其中i为点的编号
;(defun getpt (ss / i listpp a b c)
;  (setq i 0 listpp nil )
;  (if ss
;    (repeat (sslength ss)
;      (setq a (ssname ss i))
;      (setq b (entget a))
;      (setq c (cdr (assoc 10 b)))
;      (setq listpp (cons c listpp))
;      (setq i (1+ i))  
;    )
;  )
;  (reverse listpp)
;)
(defun getpt (ss / i listpp ent ent_pt1 ent_pt2 entobj)
  (setq i 0 listpp nil )
  (if ss
    (repeat (sslength ss)
      (setq ent (ssname ss i))
      (setq entobj (vlax-ename->vla-object ent))
      (setq ent_pt1 (vlax-curve-getPointAtParam entobj (vlax-curve-getStartParam entobj))
            ent_pt2 (vlax-curve-getPointAtParam entobj (vlax-curve-getEndParam entobj)))
      (setq listpp (cons ent_pt1 listpp))
      (setq listpp (cons ent_pt2 listpp))
      (setq i (1+ i))  
    )
  )
  (reverse listpp)
)

;;从J到K的表
(defun cut (ptlist j k / i ptlist1)
  (setq i 0 ptlist1 nil)
  (foreach n ptlist
    (if (and (>= i j) (<= i k) )
      (setq ptlist1 (cons n ptlist1))
    )
    (setq i (1+ i))
  )
  (reverse ptlist1)
)
;;对X排序
(defun sortX (lst / lst1 lst2 a e1 e2)
(setq lst1 '()
lst2 '()
  )
  (foreach a lst
    (if (not (member (car a) lst1))
      (setq lst1 (cons (car a) lst1)
     lst2 (cons a lst2)
      )
    )
  )
  (vl-sort lst2 '(lambda (e1 e2) (< (car e1) (car e2))))
)
;;在带形区域查找
(defun searchX (ptlist1 x1 x2 / pp n)
  (setq pp nil)
  (foreach n ptlist1
    (if (and (>= (car n) x1)(<= (car n) x2))
      (setq pp (cons n pp))
    )
  )
  (reverse pp)
)
;;在矩形区域查找
(defun searchXY (ptlist2 x1 x2 y1 y2 / pp n)
  (setq pp nil)
  (foreach n ptlist2
    (if (and (>= (car  n) x1)
             (<= (car  n) x2)
             (>= (cadr n) y1)
             (<= (cadr n) y2)
        )
      (setq pp (cons n pp))
    )
  )
  (reverse pp)
)
;;最多6点最小距离
(defun 6ptmin (ptlist4 pt / 6pmin 6plist)
  (setq 6pmin (mapcar '(lambda (x) (distance x pt)) ptlist4))
  (setq 6pmin (apply 'min 6pmin) 6plist nil)
  (foreach 6name ptlist4
    (if (equal (distance 6name pt) 6pmin 1e-8)
      (setq 6plist (cons (list pt 6name) 6plist))
    )  
  )
  (list 6pmin 6plist)                      
)
;;***************
;;程序主段-------
(defun f2 (ptlist / l p1 p2 p3 dd 3pmind 3plist ptlist1 ptlist2 ptlist3 ptlist4  
                 n m midpt mind1 mind2 mindt a b c d Dismin Dnmin nplist mindi)
  (setq n (length ptlist)
        d 0
        dist1 (distance (nth 0 ptlist)(nth 1 ptlist)))
   (princ dist1)       
  (if (> n 1)
      (progn
         (setq m 0)
         (repeat (- n 1)
            (setq i 1)
            (repeat (- n m 1)
               (setq dist0 (distance (nth m ptlist)(nth (+ m i) ptlist)))
               (if (< dist0 dist1)(setq dist1 dist0 pt1 (nth m ptlist) pt2 (nth (+ m i) ptlist)))
               (setq i (1+ i))
            )
           (setq m (1+ m))
       )))
  (cons pt1 (cons pt2 (cons dist1)))               
       
)
发表于 2012-7-17 09:43:45 | 显示全部楼层
楼主可以用图 来说明你的要求吗?
 楼主| 发表于 2012-7-17 14:04:52 | 显示全部楼层
本帖最后由 myjping 于 2012-7-17 14:06 编辑
highflybir 发表于 2012-7-17 09:43
楼主可以用图 来说明你的要求吗?


看我的CAD图,我的想法是求得最近的两个点(图中画圆的地方),但我用上面的程序始终求不对;
方法是选择线后,求得线的端点,然后把相同点过滤形成表,然后用你的程序求最小的距离



本帖子中包含更多资源

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

x
发表于 2012-7-23 11:02:13 | 显示全部楼层
myjping 发表于 2012-7-17 14:04
看我的CAD图,我的想法是求得最近的两个点(图中画圆的地方),但我用上面的程序始终求不对;
方法是选择 ...


看看上面的程序是否能满足你的要求。

本帖子中包含更多资源

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

x
发表于 2012-7-23 11:06:51 来自手机 | 显示全部楼层
做个记号,向前辈学习。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-7-21 23:43 , Processed in 0.155788 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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