找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 933|回复: 6

[求助] [求助]:如何求一个圆与一条直线的交点

[复制链接]
发表于 2007-8-23 22:47:17 | 显示全部楼层 |阅读模式

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

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

×
在LISP里如何求出已知圆与一条已知通过点和角度的直线的交点!
最好是用通过点(polar pt angle distance)来表示!!pt 通过点  angle角度
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-8-24 08:49:36 | 显示全部楼层
alisp中没有这样的函数,vlisp中有一个求交点的函数;
下面这个示例是通过逐步探测的方式:(第4楼)http://www.acad.net.cn/viewthread.php?tid=297&extra=page%3D3
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 7229个

财富等级: 富甲天下

发表于 2007-8-24 10:04:10 | 显示全部楼层
Ref link:
http://intervision.hjem.wanadoo.dk/
===>
Techniques and algorithms - page 2
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2007-8-24 14:25:00 | 显示全部楼层

  1. ;;;主程序
  2. (defun c:test(/ ptA PtB Ang Cir lst Cen Rad)
  3.   ;;输入
  4.   (if (and (setq ptA (getpoint "\n请输入一点:"))
  5.            (setq Ang (getangle ptA "\n请输入角度:"))
  6.            (setq Cir (car (entsel "\n请选择圆:")))
  7.            (setq lst (entget Cir))
  8.            (= (cdr (assoc 0 lst)) "CIRCLE")
  9.       )
  10.     (progn
  11.       (setq Cen (cdr (assoc 10 lst)))            ;圆心
  12.       (setq Rad (cdr (assoc 40 lst)))            ;半径
  13.       (setq PtB (polar ptA Ang rad))                 ;直线上的另一点
  14.       (get-line-circle-intersect cen rad ptA ptB);求值
  15.     )
  16.     (alert "无效输入!")
  17.   )
  18.   (princ)
  19. )
  20. ;;;获得线段与圆的交点的函数
  21. ;;;参数:  圆心,半径,线段起点,线段终点
  22. ;;;返回值:交点或切点的列表,如果不相交则为nil
  23. (defun Get-line-circle-intersect
  24.        (cen rad PtA PtB / Org eqt A B C D Pt0 Pt1 Pt2 Pt3 Pt4)
  25.   (setq Pt0 (mapcar '- PtA Cen))                 
  26.   (setq Pt1 (mapcar '- PtB Cen))                 ;为了减少浮点误差
  27.   (setq Org (list 0 0))                                 ;把原点移至圆心
  28.   (setq eqt (Get-Line-Equation Pt0 Pt1))          ;直线的方程
  29.   (setq        A (car eqt)                                 ;系数A
  30.         B (cadr eqt)                                 ;系数B
  31.         C (caddr eqt)                                 ;系数C
  32.   )
  33.   (setq D (/ C (sqrt (+ (* A A) (* B B)))))          ;圆心到线段的距离
  34.   (cond
  35.     ((> (abs D) (+ Rad 1e-8))                         ;如果距离大于半径
  36.      (princ "\n无解!")
  37.      nil                                         ;无解
  38.     )
  39.     ((equal (abs D) Rad 1e-8)                         ;如果距离等于半径
  40.      (princ "\n直线和圆相切!")                         ;直线跟圆相切
  41.      (setq Pt2 (Polar Org (- Ang (/ Pi 2)) D))          ;求出切点
  42.      (setq Pt2 (mapcar '+ Pt2 Cen))                 ;切点变换到原坐标系
  43.      (make-line PtA Pt2)                         ;画切线
  44.      (list Pt2)                                         ;返回切点列表
  45.     )
  46.     (t
  47.      (princ "\n直线和圆有两个交点!")                 ;直线和圆有两个交点
  48.      (setq Pt2 (Polar Org (- Ang (/ Pi 2)) D))          ;垂足点
  49.      (setq E   (sqrt (- (* Rad Rad) (* D D))))   ;半弦长
  50.      (setq Pt3 (polar Pt2 Ang E))                 ;交点一
  51.      (setq Pt3 (mapcar '+ Pt3 Cen))                 ;交点一变换到原坐标系
  52.      (setq Pt4 (polar Pt2 Ang (- E)))                 ;交点二
  53.      (setq Pt4 (mapcar '+ Pt4 Cen))                 ;交点二变换到原坐标系
  54.      (make-line Pt3 Pt4)                         ;画交线
  55.      (list Pt3 Pt4)                                 ;返回两个交点
  56.     )
  57.   )
  58. )
  59. ;;;两点的直线方程
  60. ;;;参数两个点
  61. ;;;返回值: 直线方程Ax+By+C=0的A,B,C值
  62. (defun Get-Line-Equation (Start-Pt End-Pt / x1 y1 x2 y2)
  63.   (if (equal Start-Pt End-Pt 1e-8)
  64.     nil
  65.     (progn
  66.       (setq x1 (car Start-Pt)
  67.             y1 (cadr Start-Pt)
  68.             x2 (car End-Pt)
  69.             y2 (cadr End-Pt)
  70.       )
  71.       (list (- y1 y2)
  72.             (- x2 x1)
  73.             (- (* x1 y2) (* x2 y1))
  74.       )
  75.     )
  76.   )
  77. )
  78. ;;;画线段的函数
  79. (defun make-line (Start-Pt End-Pt)
  80.   (entmake
  81.     (list
  82.       (cons 0 "LINE")
  83.       (cons 10 Start-Pt)
  84.       (cons 11 End-Pt)
  85.     )
  86.   )
  87. )
  88. ;;;获得圆的参数
  89. (defun Get-Circle-Parameters(lst)
  90.   (list (cdr (assoc 10 lst))
  91.         (cdr (assoc 40 lst))
  92.   )
  93. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-8-24 15:54:34 | 显示全部楼层
楼上解得精彩,学习中。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-8-24 17:32:27 | 显示全部楼层
圆心到线段的距离可以用 (vlax-curve-getclosestpointto cenpt lnobj T) 求

这种计算可以将 代数式 与 vlax-curve 类函数结合使用
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-26 18:28:54 | 显示全部楼层
highflybird
完全OK!完全满足要求!谢谢
Free-Lancer
vlax-curve-getclosestpointto
求点到曲线的最近距离!学会!~谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 05:43 , Processed in 0.301560 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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