找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 695|回复: 3

[求助]:如何编程求一直线与一圆的交点及两交点的距离

[复制链接]
发表于 2005-12-27 10:31:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
如何编程求一直线与一圆的交点及两交点的距离
希望能提供编程思想
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-12-27 16:06:40 | 显示全部楼层

  1. (defun c:tt (/ e1 e2 el1 el2 cen r pl p1 p2)
  2.   (if (and (setq e1 (car (entsel "\nPick Circle ...")))
  3.            (setq el1 (entget e1))
  4.            (= (cdr (assoc 0 el1)) "CIRCLE")
  5.            (setq e2 (car (entsel "\nPick Line ...")))
  6.            (setq el2 (entget e2))
  7.            (= (cdr (assoc 0 el2)) "LINE")
  8.       )
  9.     (progn
  10.       (setq cen        (cdr (assoc 10 el1))
  11.             r        (cdr (assoc 40 el1))
  12.       )
  13.       (if (<= (distance cen (vlax-curve-getclosestpointto e2 cen))
  14.               r
  15.           )
  16.         (progn
  17.           (princ "\n")
  18.           (setq        pl (safearray-value
  19.                      (variant-value
  20.                        (vla-intersectwith
  21.                          (vlax-ename->vla-object e1)
  22.                          (vlax-ename->vla-object e2)
  23.                          acextendnone
  24.                        )
  25.                      )
  26.                    )
  27.           )
  28.           (princ (setq p1 (list        (car pl)
  29.                                 (cadr pl)
  30.                                 (caddr pl)
  31.                           )
  32.                  )
  33.           )
  34.           (princ "\n")
  35.           (princ (setq p2 (list        (nth 3 pl)
  36.                                 (nth 4 pl)
  37.                                 (last pl)
  38.                           )
  39.                  )
  40.           )
  41.           (princ "\nDistance = ")
  42.           (princ (distance p1 p2))
  43.         )
  44.         (princ "\nNo Inters!")
  45.       )
  46.     )
  47.   )
  48.   (princ)
  49. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 5188个

财富等级: 富甲天下

发表于 2005-12-27 21:44:16 | 显示全部楼层
记得R12中的DLINE.LSP吗?其中就有你想要的。
基本思路为:从圆心ptc做直线的垂线,交点pti,两点距离L若小于半径rad,则有两个交点。从圆心至其中一个交点pt1做直线,长度为半径rad。直角三角形已知两条边长度,可求其夹角ang1,又(setq ang2 (angle ptc pti)),则pt1角度ang为(- ang2 ang1),可求出pt1坐标 (polar ptc ang rad),另一交点pt2角度为 (+ ang2 ang1),两点距离为 (distance pt1 pt2)。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 111个

财富等级: 日进斗金

发表于 2005-12-28 16:28:48 | 显示全部楼层
;请试用以下程序
;采用传统的LISP方法求解 by yshf

  1. (defun c:cc()
  2.     (while (progn
  3.              (setq en1 (entsel "\n请选择直线段:") ent1 (car en1))
  4.              (or (= en1 nil) (not (= (setq na (cdr (assoc 0 (setq lin (entget ent1))))) "LINE")))
  5.            )
  6.        (alert "选中的不是直线,请重新选择直线段!")   
  7.     )
  8.     (while (progn
  9.              (setq en2 (entsel "请选择圆:") ent2 (car en2))
  10.              (or (= en2 nil) (not (= (setq na (cdr (assoc 0 (setq lin (entget ent2))))) "CIRCLE")))
  11.            )
  12.        (alert "选中的不是圆,请重新选择圆!")     
  13.     )
  14.     (command "_undo" "be")
  15.     (setq p10 (cdr (assoc 10 (entget ent1)))
  16.           p11 (cdr (assoc 11 (entget ent1)))
  17.           ptb nil
  18.           pjd nil
  19.     )
  20.     (while (progn (command "_extend" ent2 "" (list ent1 p10) "")
  21.                   (setq pjd (cdr (assoc 10 (entget ent1))))
  22.                   (not (equal p10 pjd))
  23.            )
  24.                        
  25.        (setq ptb (cons pjd ptb)
  26.              p10 pjd
  27.        )
  28.     )
  29.     (while (progn (command "_extend" ent2 "" (list ent1 p11) "")
  30.                   (setq pjd (cdr (assoc 11 (entget ent1))))
  31.                   (not (equal p11 pjd))
  32.            )
  33.                        
  34.        (setq ptb (cons pjd ptb)
  35.              p11 pjd
  36.        )
  37.     )
  38.     (command "_undo" "e")(command "u")
  39.     (cond ((= ptb nil) (alert "直线与圆没有交点!"))
  40.           ((= (length ptb) 1)
  41.            (alert
  42.               (strcat "直线与圆只有一个交点:("
  43.                       (rtos (car (car ptb)) 2 3) ", " (rtos (cadr (car ptb)) 2 3) ")"
  44.               )
  45.            )
  46.           )
  47.           ((= (length ptb) 2)
  48.            (alert (strcat "直线与圆的两个交点为:"
  49.                           "\n   (" (rtos (car (car ptb)) 2 3) ", " (rtos (cadr (car ptb)) 2 3) ")"
  50.                           "\n   (" (rtos (car (cadr ptb)) 2 3) ", " (rtos (cadr (cadr ptb)) 2 3) ")"           
  51.                           "\n距离为:" (rtos (distance (car ptb) (cadr ptb)) 2 3)
  52.                   )
  53.            )
  54.          )
  55.     )
  56.     (princ)
  57. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-21 20:11 , Processed in 0.176391 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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