明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5139|回复: 10

求助:(autolisp)两条线段相交,已知其中一条线段的两点,如何求出另一条线段的两点

[复制链接]
发表于 2002-5-7 21:19:00 | 显示全部楼层 |阅读模式
求助:(autolisp)两条线段相交,已知其中一条线段的两点,如何求出另一条线段的两点?[br]
发表于 2002-5-7 22:30:00 | 显示全部楼层

线都有了,点还能不知道?要不您怎么生成的呀?

发表于 2002-5-7 22:50:00 | 显示全部楼层

程序如内,执行命令getline

(defun I:EntSelF
(Msg                 ; selection prompt
  Filter              ; filter list
  /
  EntN                ; (entsel) list, or "Exit" string
  pbDist              ; pickbox size in drawing units
  PtPick              ; point of selection from (entsel)
  ssPick              ; selection set
) ;_ closes variable declare
(while (not EntN)    ; while no selection (or no exit)
  (setq
   EntN (if Msg                 ; if selection prompt
         (entsel Msg)           ; then (entsel) w/prompt

         (entsel)               ; else plain (entsel)
        ) ;_ closes if
  ) ;_ closes setq
  (if (= (getvar "ErrNo") 52)   ; if null response
   (setq EntN "Exit")           ; then set flag to exit
  ) ;_ closes if
) ;_ closes while
(cond
  ((/= EntN "Exit")             ; if not exit
   (setq
    pbDist (abs                 ; return absolute number
            (/
             (*
              (/                ; get pixel ratio
               (getvar "ickBox")
               (cadr (getvar "ScreenSize"))
              )
              (getvar "ViewSize") ; apply to viewsize
             ) ;_ closes *
            (sin (* 0.25 pi))   ; at 45?
            ) ;_ closes /
           ) ;_ closes abs
    PtPick (cadr EntN)          ; get point of pick
   ) ;_ closes setq
   (if (setq ssPick (ssget "_C" ; if entities in crossing
                     (polar PtPick (* 1.25 pi) pbDist)
                     (polar PtPick (* 0.25 pi) pbDist)
                     Filter     ; match filter, if any
                   ) ;_ closes ssget
       ) ;_ closes setq
    (cons            ; then return first entity as (entsel)
     (ssname ssPick 0) (list PtPick)
    ) ;_ closes cons
   ) ;_ closes if
  ) ;_ closes condition
) ;_ closes cond
) ;_ closes defun I:EntSelF
(defun c:getline(/ filne flineent spntfl epntfl sliness sel_num count slineent spntsl epntsl)
  (setq fline(I:EntSelF "选择直线: " '((0 . "line"))) )
  (setq flineent(entget (car fline)))
  (setq spntfl(cdr (assoc 10 flineent)))
  (setq epntfl(cdr (assoc 11 flineent)))
  (entdel (car fline))
  
  (setq sliness(ssget "f" (list spntfl epntfl) '((0 . "line"))))
  (if (not sliness)
        (progn
            (princ "\n没有直线与选定的直线相交")
        )
        (progn
          (setq sel_num (sslength sliness))
          (princ (strcat "\n有" (itoa sel_num) "条直线与选定的直线相交,以下为交点的列表:"))
          (setq count 0)
          (repeat sel_num
            (setq slineent(entget (ssname sliness count)))
            (setq spntsl(cdr(assoc 10 slineent)))
            (setq epntsl(cdr(assoc 11 slineent)))
            (princ (strcat "\n第" (itoa(+ count 1)) "条直线的起点坐标为("))
            (princ spntsl)
            (princ "),终点坐标为(")
            (princ epntsl)
            (princ ")")
            (setq count (+ count 1))
            )
          )
    )
  (entdel (car fline))
  )
发表于 2002-5-8 15:50:00 | 显示全部楼层

简单的方法

假设P0、P1为已知线段的端点
(setq sa (ssget "C" p0 p1 '((0 . "LINE"))))
(if (and (/= sa nil) (= (sslength sa) 1))
  (setq
     d0 (cdr (assoc '10 (entget (ssname sa 0))))
     d1 (cdr (assoc '11 (entget (ssname sa 0))))
  )
)
d0、d1即为与其相交线段的端点
发表于 2002-5-12 10:06:00 | 显示全部楼层

位于p0与p1选择筐内且与p0_1直线平行怎办?

发表于 2002-5-12 13:22:00 | 显示全部楼层

就是不平行也有不相交的时候

发表于 2002-5-13 09:00:00 | 显示全部楼层

废话,他的前提不就是已知“两条线段相交”了嘛!

废话,他的前提不就是已知“两条线段相交”了嘛!
发表于 2002-5-13 10:37:00 | 显示全部楼层

看看这个图中有三个线段,一个相交,一个不相交,也符合他的条件

本帖子中包含更多资源

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

x
发表于 2002-5-14 08:21:00 | 显示全部楼层

简单的方法之补充

本帖最后由 作者 于 2002-5-14 8:21:27 编辑

简单的方法之补充:
假设P0、P1为已知线段的端点
(setq sa (ssget "C" p0 p1 '((0 . "LINE"))))
(if (= sa nil)
  (alert "没有线段与已知线段相交!")
  (progn
    (setq i 0)
    (setq test T)
    (while (< i (sslength sa))
      (setq
        d0 (cdr (assoc '10 (entget (ssname sa i))))
        d1 (cdr (assoc '11 (entget (ssname sa i))))
      )
      (if (inters p0 p1 d0 d1)
        (progn
         (princ "\n与之相交的第")
         (princ (+ i 1))
         (princ "条线段端点为:")
         (princ d0)
         (princ d1)
         (setq test nil)
        )
      )
      (setq i (+ i 1))
    )
    (if test (alert "没有线段与已知线段相交!"))
  )
)
发表于 2002-5-14 09:12:00 | 显示全部楼层

大家这么热心为您出主意,您怎么不说话?已经一周了,“走路”先生!

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 15:41 , Processed in 0.292606 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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