找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2436|回复: 7

[每日一码] 求直线与圆弧的交点

[复制链接]

已领礼包: 146个

财富等级: 日进斗金

发表于 2014-8-29 21:50:50 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 lgx9612 于 2014-8-30 08:15 编辑

求直线与圆弧的交点(附:直线跟圆弧都是给定参数而定的,图中并没有这此图素,是虚拟的,此程序用来计算用
  1. (defun inters_arc&line (l-point1 l-point2 c-centerpoint c-rad r-start-ang r-end-ang / line_angle_lgx per-line_oarc-point_lgx
  2.            line-inters-perline length-perline_lgx return_result_lgx length-inter-arc_lgx inter-point1 inter-point2
  3.            return_point interangle-lgx)
  4. ;;;原创,编写:刘国新
  5. ;;;求直线与圆弧的交点
  6. ;;;使用方法如下1;
  7. ;;;(inters_arc&line (getpoint "点一\n") (getpoint "点一\n") (cdr (assoc 10 (setq arc (entget (car (entsel "请选择圆弧\n"))))))
  8. ;;;(cdr (assoc 40 arc))(cdr (assoc 50 arc))(cdr (assoc 51 arc)))
  9. ;;;使用方法如下2;
  10. ;;;(inters_arc&line (cdr (assoc 10 (setq line (entget (car (entsel "请选择直线\n")))))) (cdr (assoc 11 line))
  11. ;;;(cdr (assoc 10 (setq arc (entget (car (entsel "请选择圆弧\n"))))))
  12. ;;;(cdr (assoc 40 arc))(cdr (assoc 50 arc))(cdr (assoc 51 arc)))
  13. ;;;参数如下
  14. ;;;l-point1 直线的起点
  15. ;;;l-point2 直线的终点
  16. ;;;c-centerpoint 圆弧的中心点
  17. ;;;c-rad         圆弧的半径
  18. ;;;r-start-ang   圆弧起始角,弧度值
  19. ;;;r-end-ang     圆弧终止角,弧度值
  20. (if (or (= l-point1 nil) (= l-point2 nil) (= c-centerpoint nil)(= c-rad nil)(<= c-rad 0))
  21. (setq return_result_lgx nil)
  22. (progn
  23. (setq line_angle_lgx (angle l-point1 l-point2))
  24. (setq per-line_oarc-point_lgx (polar c-centerpoint (+ line_angle_lgx (* pi 0.5)) c-rad))
  25. (setq line-inters-perline (inters l-point1 l-point2 per-line_oarc-point_lgx c-centerpoint nil))
  26. (setq length-perline_lgx (distance c-centerpoint line-inters-perline))
  27. (if (= r-start-ang nil)
  28. (setq r-start-ang 0.0)
  29. )
  30. (if (= r-end-ang nil)
  31. (setq r-end-ang 0.0)
  32. )
  33. (setq r-start-ang (atof (angtos r-start-ang 0 8)))
  34. (setq r-end-ang (atof (angtos r-end-ang 0 8)))
  35. (if (and (= r-end-ang 0.0)(= r-start-ang 0.0))
  36. (setq r-end-ang 360.0)
  37. )
  38. (progn
  39. (setq return_result_lgx nil)
  40. (if (< (abs (- length-perline_lgx c-rad)) 0.001)
  41. (progn
  42. (setq inter-point1 line-inters-perline)
  43. (setq inter-point2 nil)
  44. )
  45. (if (< (- length-perline_lgx c-rad) 0)
  46. (progn
  47. (setq length-inter-arc_lgx (sqrt (- (* c-rad c-rad) (* length-perline_lgx length-perline_lgx))))
  48. (setq inter-point1 (polar line-inters-perline line_angle_lgx length-inter-arc_lgx))
  49. (setq inter-point2 (polar line-inters-perline (+ line_angle_lgx pi) length-inter-arc_lgx))
  50. )
  51. (progn
  52. (setq inter-point1 nil)
  53. (setq inter-point2 nil)
  54. )
  55. )
  56. )
  57. (if (/= inter-point1 nil)
  58. (if (/= (setq return_point (inters l-point1 l-point2 inter-point1 c-centerpoint)) nil)
  59. (progn
  60. (setq interangle-lgx (atof (angtos (angle c-centerpoint return_point) 0 8)))
  61. (if (< r-end-ang r-start-ang)
  62. (if (or (<= interangle-lgx r-end-ang)(>= interangle-lgx r-start-ang))
  63. (setq return_result_lgx (list 1 return_point))
  64. )
  65. (if (and (>= interangle-lgx r-start-ang)(<= interangle-lgx r-end-ang))
  66. (setq return_result_lgx (list 1 return_point))
  67. )
  68. )
  69. )
  70. (if (/= (setq return_point (inters l-point1 l-point2 inter-point1 (polar inter-point1 (+ (angle c-centerpoint inter-point1) (* pi 0.5)) 5))) nil)  
  71. (progn
  72. (setq interangle-lgx (atof (angtos (angle c-centerpoint return_point) 0 8)))
  73. (if (< r-end-ang r-start-ang)
  74. (if (or (<= interangle-lgx r-end-ang)(>= interangle-lgx r-start-ang))
  75. (setq return_result_lgx (list 1 return_point))
  76. )
  77. (if (and (>= interangle-lgx r-start-ang)(<= interangle-lgx r-end-ang))
  78. (setq return_result_lgx (list 1 return_point))
  79. )
  80. )
  81. )
  82. (if (or (equal inter-point1 l-point1 0.005)(equal inter-point1 l-point2 0.005))
  83. (setq return_result_lgx (list 1 inter-point1))
  84. )
  85. )
  86. )
  87. )
  88. (if (/= inter-point2 nil)
  89. (if (/= (setq return_point (inters l-point1 l-point2 inter-point2 c-centerpoint)) nil)
  90. (if (= return_result_lgx nil)
  91. (progn
  92. (setq interangle-lgx (atof (angtos (angle c-centerpoint return_point) 0 8)))
  93. (if (< r-end-ang r-start-ang)
  94. (if (or (<= interangle-lgx r-end-ang)(>= interangle-lgx r-start-ang))
  95. (setq return_result_lgx (list 1 return_point))
  96. )
  97. (if (and (>= interangle-lgx r-start-ang)(<= interangle-lgx r-end-ang))
  98. (setq return_result_lgx (list 1 return_point))
  99. )
  100. )
  101. )
  102. (progn
  103. (setq interangle-lgx (atof (angtos (angle c-centerpoint return_point) 0 8)))
  104. (if (< r-end-ang r-start-ang)
  105. (if (or (<= interangle-lgx r-end-ang)(>= interangle-lgx r-start-ang))
  106. (setq return_result_lgx (list 2 (cadr return_result_lgx) return_point))
  107. )
  108. (if (and (>= interangle-lgx r-start-ang)(<= interangle-lgx r-end-ang))
  109. (setq return_result_lgx (list 2 (cadr return_result_lgx) return_point))
  110. )
  111. )
  112. )
  113. )
  114. (if (/= (setq return_point (inters l-point1 l-point2 inter-point2 (polar inter-point2 (+ (angle c-centerpoint inter-point2) (* pi 0.5)) 5))) nil)
  115. (if (= return_result_lgx nil)
  116. (progn
  117. (setq interangle-lgx (atof (angtos (angle c-centerpoint return_point) 0 8)))
  118. (if (< r-end-ang r-start-ang)
  119. (if (or (<= interangle-lgx r-end-ang)(>= interangle-lgx r-start-ang))
  120. (setq return_result_lgx (list 1 return_point))
  121. )
  122. (if (and (>= interangle-lgx r-start-ang)(<= interangle-lgx r-end-ang))
  123. (setq return_result_lgx (list 1 return_point))
  124. )
  125. )
  126. )
  127. (progn
  128. (setq interangle-lgx (atof (angtos (angle c-centerpoint return_point) 0 8)))
  129. (if (< r-end-ang r-start-ang)
  130. (if (or (<= interangle-lgx r-end-ang)(>= interangle-lgx r-start-ang))
  131. (setq return_result_lgx (list 2 (cadr return_result_lgx) return_point))
  132. )
  133. (if (and (>= interangle-lgx r-start-ang)(<= interangle-lgx r-end-ang))
  134. (setq return_result_lgx (list 2 (cadr return_result_lgx) return_point))
  135. )
  136. )
  137. )
  138. )
  139. (if (or (equal inter-point2 l-point1 0.005)(equal inter-point2 l-point2 0.005))
  140. (if (= return_result_lgx nil)
  141. (setq return_result_lgx (list 1 inter-point2))
  142. (setq return_result_lgx (list 2 (cadr return_result_lgx) inter-point2))
  143. )
  144. )
  145. )
  146. )
  147. )
  148. )
  149. )
  150. )
  151. (princ)
  152. return_result_lgx
  153. )


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

已领礼包: 6881个

财富等级: 富甲天下

发表于 2014-8-30 10:04:42 | 显示全部楼层
你这全局变理太多了
交点有一个或两个
你这不知是如何判断的

点评

判断相交的点是否在圆弧的起始角和终止角之间  详情 回复 发表于 2014-8-30 13:28
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-8-30 10:49:38 | 显示全部楼层
精神值得鼓励,不过用 ActiveX 的 IntersectWith 更简单,AutoCAD 下就用 AuotDESK方法

点评

可否赐教!  详情 回复 发表于 2014-8-30 12:33
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 146个

财富等级: 日进斗金

 楼主| 发表于 2014-8-30 12:33:24 | 显示全部楼层
csharp 发表于 2014-8-30 10:49
精神值得鼓励,不过用 ActiveX 的 IntersectWith 更简单,AutoCAD 下就用 AuotDESK方法

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

使用道具 举报

已领礼包: 146个

财富等级: 日进斗金

 楼主| 发表于 2014-8-30 13:28:25 | 显示全部楼层
ynhh 发表于 2014-8-30 10:04
你这全局变理太多了
交点有一个或两个
你这不知是如何判断的

判断相交的点是否在圆弧的起始角和终止角之间
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-8-30 13:33:31 | 显示全部楼层

虚与实是相对的,虚虚实实
  1. (defun l&arc (lsp lep acp radius asan aean / ln arc ms ptl pts)
  2.   (setq        ms  (vla-get-modelspace
  3.               (vla-get-activedocument (vlax-get-acad-object))
  4.             )
  5.         ln  (vlax-invoke ms 'AddLine lsp lep)
  6.         arc (vlax-invoke ms 'AddArc acp radius asan aean)
  7.   )
  8.   (if (setq pts (vlax-invoke ln 'IntersectWith arc 0))
  9.     (if        (= (length pts) 3)
  10.       (setq ptl pts)
  11.       (setq ptl        (list (list (car pts) (cadr pts) (caddr pts))
  12.                       (cdddr pts)
  13.                 )
  14.       )
  15.     )
  16.   )
  17.   (mapcar 'vla-delete (list ln arc))
  18.   ptl
  19. )

点评

受教,谢谢!  详情 回复 发表于 2014-8-30 13:49
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 146个

财富等级: 日进斗金

 楼主| 发表于 2014-8-30 13:49:42 | 显示全部楼层
st788796 发表于 2014-8-30 13:33
虚与实是相对的,虚虚实实

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

使用道具 举报

已领礼包: 1094个

财富等级: 财源广进

发表于 2021-7-1 00:03:43 | 显示全部楼层
感谢楼主分享求直线与圆弧的交点!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 14:08 , Processed in 0.409315 second(s), 48 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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