找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3220|回复: 14

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

[复制链接]

已领礼包: 146个

财富等级: 日进斗金

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

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

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

×
本帖最后由 lgx9612 于 2014-8-31 18:15 编辑

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


评分

参与人数 1D豆 +5 收起 理由
newer + 5 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-8-29 22:02:36 | 显示全部楼层
纯数学方法?

点评

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

使用道具 举报

已领礼包: 9802个

财富等级: 富甲天下

发表于 2014-8-30 07:46:29 | 显示全部楼层

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

使用道具 举报

已领礼包: 146个

财富等级: 日进斗金

 楼主| 发表于 2014-8-30 08:19:00 | 显示全部楼层

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

使用道具 举报

已领礼包: 6881个

财富等级: 富甲天下

发表于 2014-8-30 10:03:08 | 显示全部楼层
你数学功力好啊
这一类的交点有一个或两个
你又如何判断啊

点评

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

使用道具 举报

已领礼包: 685个

财富等级: 财运亨通

发表于 2014-8-30 11:20:17 | 显示全部楼层
好像之前看过谁的贴
用VL函数写的
很简结啊
不过楼主的数学功底好得不得了啊

点评

你应该说的是vla-intersectwith函数吧,这个不需要计算,将ename转为vla-object就可以得到交点的,但我现在的前提是两个圆弧都没有图,只有参数(虚拟两个圆弧来计算是否有交点). 我的程序是用在如:我有  详情 回复 发表于 2014-8-30 13:25
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 146个

财富等级: 日进斗金

 楼主| 发表于 2014-8-30 13:25:25 | 显示全部楼层
ysq101 发表于 2014-8-30 11:20
好像之前看过谁的贴
用VL函数写的
很简结啊

      你应该说的是vla-intersectwith函数吧,这个不需要计算,将ename转为vla-object就可以得到交点的,但我现在的前提是两个圆弧都没有图,只有参数(虚拟两个圆弧来计算是否有交点).      我的程序是用在如:我有已知的两个圆弧,但如果将两个圆弧都偏大或偏小一个距离后求他们是否有相交,多少个交点?

点评

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

使用道具 举报

已领礼包: 146个

财富等级: 日进斗金

 楼主| 发表于 2014-8-30 13:35:16 | 显示全部楼层
ynhh 发表于 2014-8-30 10:03
你数学功力好啊
这一类的交点有一个或两个
你又如何判断啊

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-8-30 13:40:16 | 显示全部楼层
lgx9612 发表于 2014-8-30 13:35
分别判断交点是否在圆弧的起始角与终止角之间

节省的时间可以用来研究其他的
  1. (defun arc&arc (a1c a1r        a1san a1ean a2c        a2r a2san a2ean        / arc1 arc2 pts
  2.                 ptl ms)
  3.   (setq        ms   (vla-get-modelspace
  4.                (vla-get-activedocument (vlax-get-acad-object))
  5.              )
  6.         arc1 (vlax-invoke ms 'AddArc a1c a1r a1san a1ean)
  7.         arc2 (vlax-invoke ms 'AddArc a2c a2r a2san a2ean)
  8.   )
  9.   (if (setq pts (vlax-invoke arc1 'IntersectWith arc2 0))
  10.     (if        (= (length pts) 3)
  11.       (setq ptl pts)
  12.       (setq ptl        (list (list (car pts) (cadr pts) (caddr pts))
  13.                       (cdddr pts)
  14.                 )
  15.       )
  16.     )
  17.   )
  18.   (mapcar 'vla-delete (list arc1 arc2))
  19.   ptl
  20. )

点评

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

使用道具 举报

已领礼包: 146个

财富等级: 日进斗金

 楼主| 发表于 2014-8-30 13:49:01 | 显示全部楼层
st788796 发表于 2014-8-30 13:40
节省的时间可以用来研究其他的

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-8-30 13:49:17 | 显示全部楼层
lgx9612 发表于 2014-8-30 13:25
你应该说的是vla-intersectwith函数吧,这个不需要计算,将ename转为vla-object就可以得到交点的, ...

你可以根据参数生成两个临时的实体,求交后,再删除掉生成的临时实体。

点评

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

使用道具 举报

已领礼包: 685个

财富等级: 财运亨通

发表于 2014-8-30 17:09:37 | 显示全部楼层
newer 发表于 2014-8-30 13:49
你可以根据参数生成两个临时的实体,求交后,再删除掉生成的临时实体。

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

使用道具 举报

已领礼包: 146个

财富等级: 日进斗金

 楼主| 发表于 2014-8-31 22:02:10 | 显示全部楼层
我的程序(只是我的程序的一部分,拿出分享一下,当然我也从大家身上学到很多)臃肿,长而不好理解,但并对机算机来说,运行并不在乎你的程序是否简短,下面的对比会让你吃惊。
当然要看程序用在哪一方面,单解决一个问题的话运行时间自然不会加以考虑。
如果你懂汇编的话,就像需要敲几万行汇编代码你甚至可以用一两个win函数搞定。
(progn
(setq time_start (* 1000000 (getvar "cdate")))
(repeat 100000  
(arc&arc a1c a1r a1san a1ean a2c  a2r a2san a2ean)  
)
(setq time_end (* 1000000 (getvar "cdate")))
(princ (rtos (- time_end time_start)))
(princ)
);;;用时167.0664

(progn
(setq time_start (* 1000000 (getvar "cdate")))
(repeat 100000  
(inters_arc&arc a1c a1r a1san a1ean a2c  a2r a2san a2ean)
)
(setq time_end (* 1000000 (getvar "cdate")))
(princ (rtos (- time_end time_start)))
(princ)
);;;用时76.0469
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-8-31 22:27:19 | 显示全部楼层
本帖最后由 st788796 于 2014-8-31 22:30 编辑
lgx9612 发表于 2014-8-31 22:02
我的程序(只是我的程序的一部分,拿出分享一下,当然我也从大家身上学到很多)臃肿,长而不好理解,但并对机 ...

这样的应用会到那么多级别吗? 10W次才差一倍,可以忽略

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 08:18 , Processed in 0.388675 second(s), 57 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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