找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3998|回复: 16

[每日一码] 已知三点求按顺序通过三点的圆弧中心点,半径,起始角,终止角

[复制链接]

已领礼包: 146个

财富等级: 日进斗金

发表于 2014-8-30 23:06:26 | 显示全部楼层 |阅读模式

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

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

×
已知三点求按顺序通过三点的圆弧中心点,半径,起始角,终止角
  1. ;;;先来个简单的
  2. (defun arc_r-c-s-e-01 (ppoint1 ppoint2 ppoint3 / arcdate);;;我相信多数会喜欢这个简单的
  3. ;;;使用示例
  4. ;;;(progn
  5. ;;;(setq arc-parm (arc_r-c-s-e-01 (getpoint "\n 指定圆弧第一点:")(getpoint "\n 指定圆弧第二点:")(getpoint "\n 指定圆弧第三点:")))
  6. ;;;(setq myspace (vla-get-modelspace(vla-get-activedocument (vlax-get-acad-object))))
  7. ;;;(setq arc (vlax-invoke myspace 'AddArc (car arc-parm)(cadr arc-parm)(caddr arc-parm)(last arc-parm)))
  8. ;;;)
  9. (command "arc" ppoint1 ppoint2 ppoint3)
  10. (setq arcdate (entget (entlast)))
  11. (command "erase" (entlast) "")
  12. (list (cdr (assoc 10 arcdate))(cdr (assoc 40 arcdate))(cdr(assoc 50 arcdate))(cdr(assoc 51 arcdate)))
  13. )


  14. ;;;来个蛋痛的
  15. (defun arc_r-c-s-e (ppoint1 ppoint2 ppoint3 / angle_pt2 length_a length_b length_c angle_pt1 angle_pt2 angle_pt3
  16.         length-m3-1 perline-pt3 arc-r-lgx ppoint4 ppoint4-1 center-point_lgx length-d startangle_lgx
  17.         midangle_lgx endangle_lgx)
  18. ;;;原创,编写:刘国新
  19. ;;;已知三点求按顺序通过三点的圆弧中心点,半径,起始角,终止角
  20. ;;;调用方法如下
  21. ;;;(arc_r-c-s-e (getpoint "\n 指定圆弧第一点:")(getpoint "\n 指定圆弧第二点:")(getpoint "\n 指定圆弧第三点:"))
  22. (setq angle_pt2 nil)
  23. (progn
  24. (setq length_a (distance ppoint1 ppoint2))
  25. (setq length_b (distance ppoint1 ppoint3))
  26. (setq length_c (distance ppoint2 ppoint3))
  27. (if (< (max length_c length_b length_a)(- (+ length_c length_b length_a) (max length_c length_b length_a)))
  28. (if (or (= length_c 0) (= length_b 0) (= length_a 0))
  29. (princ "\n请输入正确的数值!\n")
  30. (progn
  31. (setq angle_pt1 (/ (- (+ (* length_a length_a)(* length_b length_b))(* length_c length_c))(* length_a length_b 2)))
  32. (setq angle_pt1 (- (/ pi 2.0) (atan (/ angle_pt1 (sqrt (- 1.0 (* angle_pt1 angle_pt1)))))))
  33. (setq angle_pt2 (/ (- (+ (* length_c length_c)(* length_a length_a))(* length_b length_b))(* length_c length_a 2)))
  34. (setq angle_pt2 (- (/ pi 2.0) (atan (/ angle_pt2 (sqrt (- 1.0 (* angle_pt2 angle_pt2)))))))
  35. (setq angle_pt3 (- pi angle_pt1 angle_pt2))
  36. )
  37. )
  38. (princ "\n请输入正确的数值!\n")
  39. )
  40. )
  41. (if (and (/= angle_pt1 nil)(/= angle_pt2 nil)(/= angle_pt3 nil))
  42. (progn
  43. (cond
  44. ((> (fix (* angle_pt2 10000.0)) (fix (* (* pi 0.5) 10000.0)))
  45. (setq length-m3-1 (- length_b (/ length_a (cos angle_pt1))))
  46. (setq perline-pt3  (* (/ (sin(- (* pi 0.5) angle_pt1)) (cos (- (* pi 0.5) angle_pt1))) length-m3-1))
  47. (setq arc-r-lgx (/ (sqrt (+ (* perline-pt3 perline-pt3)(* length_b length_b))) 2.0))
  48. (setq ppoint4 (polar ppoint3 (+ (angle ppoint3 ppoint1)(* pi 0.5)) perline-pt3))
  49. (setq ppoint4-1 (polar ppoint3 (+ (angle ppoint3 ppoint1)(* pi 1.5)) perline-pt3))
  50. (if (> (distance ppoint2 ppoint4)(distance ppoint2 ppoint4-1))
  51. (setq ppoint4 ppoint4)
  52. (setq ppoint4 ppoint4-1)
  53. )
  54. (setq center-point_lgx (polar ppoint1 (angle ppoint1 ppoint4) arc-r-lgx))
  55. )
  56. ((equal angle_pt2 (* pi 0.5) 0.0005)
  57. (setq arc-r-lgx (/ length_b 2.0))
  58. (setq center-point_lgx (polar ppoint1 (angle ppoint1 ppoint3) arc-r-lgx))
  59. )
  60. ((< (fix (* angle_pt2 10000.0)) (fix (* (* pi 0.5) 10000.0)))
  61. (setq length-d (* length_c (sin (- (* pi 0.5) angle_pt2))))
  62. (setq perline-pt3 (/ length-d (cos (- (* pi 0.5)(- (* pi 0.5) angle_pt3)(- (* pi 0.5) angle_pt2)))))
  63. (setq arc-r-lgx (/ (sqrt (+ (* length_b length_b)(* perline-pt3 perline-pt3))) 2.0))
  64. (setq ppoint4 (polar ppoint3 (+ (angle ppoint3 ppoint1)(* pi 0.5)) perline-pt3))
  65. (setq ppoint4-1 (polar ppoint3 (+ (angle ppoint3 ppoint1)(* pi 1.5)) perline-pt3))
  66. (if (> (distance ppoint2 ppoint4)(distance ppoint2 ppoint4-1))
  67. (setq ppoint4 ppoint4-1)
  68. (setq ppoint4 ppoint4)
  69. )
  70. (setq center-point_lgx (polar ppoint1 (angle ppoint1 ppoint4) arc-r-lgx))
  71. )
  72. )
  73. (setq startangle_lgx (atof (angtos (setq angle-pt1 (angle center-point_lgx ppoint1)) 0 8)))
  74. (setq midangle_lgx (atof (angtos (setq angle-pt2 (angle center-point_lgx ppoint2)) 0 8)))
  75. (setq endangle_lgx (atof (angtos (setq angle-pt3 (angle center-point_lgx ppoint3)) 0 8)))
  76. (if (< endangle_lgx startangle_lgx)
  77. (if (or (<= midangle_lgx endangle_lgx)(>= midangle_lgx startangle_lgx))
  78. (progn
  79. (setq startangle_lgx angle-pt1)
  80. (setq endangle_lgx angle-pt3)
  81. )
  82. (progn
  83. (setq startangle_lgx angle-pt3)
  84. (setq endangle_lgx angle-pt1)
  85. )
  86. )
  87. (if (and (>= midangle_lgx startangle_lgx)(<= midangle_lgx endangle_lgx))
  88. (progn
  89. (setq startangle_lgx angle-pt1)
  90. (setq endangle_lgx angle-pt3)
  91. )
  92. (progn
  93. (setq startangle_lgx angle-pt3)
  94. (setq endangle_lgx angle-pt1)
  95. )
  96. )
  97. )
  98. )
  99. )
  100. (list center-point_lgx arc-r-lgx startangle_lgx endangle_lgx)
  101. )


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

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-8-30 23:15:49 | 显示全部楼层
(command "arc" ppoint1 ppoint2 ppoint3)

这句话是不是要加个判断,因为任意三点不一定就能画出ARC的。

点评

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

使用道具 举报

已领礼包: 146个

财富等级: 日进斗金

 楼主| 发表于 2014-8-30 23:18:38 | 显示全部楼层
newer 发表于 2014-8-30 23:15
(command "arc" ppoint1 ppoint2 ppoint3)

这句话是不是要加个判断,因为任意三点不一定就能画出ARC的。

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-8-31 07:13:32 | 显示全部楼层
看到楼主这样用 Autolisp  忍不住说几句,在 Autocad 下计算和几何要结合起来运用

1 不能有重复点
2 两线段的中垂线交点(如果存在)为圆心

  1. (defun 3parc (p1 p2 p3 / midp mp1 mp2 mp11 mp21 an1 an2 p san ean)
  2.   (if (or (equal p1 p2 1e-6)
  3.           (equal p2 p3 1e-6)
  4.           (equal p3 p1 1e-6)
  5.       )
  6.     nil
  7.     (progn
  8.       (setq midp '((x y) (mapcar '* (mapcar '+ x y) '(0.5 0.5 0.5)))
  9.             mp1         (midp p1 p2)
  10.             mp2         (midp p2 p3)
  11.             an1         (angle p1 p2)
  12.             an2         (angle p2 p3)
  13.             mp11 (polar mp1 (+ an1 (/ pi 2)) 1.)
  14.             mp21 (polar mp2 (+ an2 (/ pi 2)) 1.)
  15.       )
  16.       (if (setq p (inters mp1 mp11 mp2 mp21 nil))
  17.         (progn
  18.           (setq r (distance p p1))
  19.           (if (< (setq ean (angle p p3)) (setq san (angle p p1)))
  20.             (list p r san (+ pi pi ean))
  21.             (list p r san ean)
  22.           )
  23.         )
  24.         nil
  25.       )
  26.     )
  27.   )
  28. )

点评

aeo
你这求出了只是平面的圆心,不是3维空间的  详情 回复 发表于 2014-9-11 17:18
谢谢高人指点.下面的判断似乎还要反过判断一次。(if (< (setq ean (angle p p3)) (setq san (angle p p1))) (list p r san (+ pi pi ean)) (list p r san ean) )  详情 回复 发表于 2014-8-31 08:43
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 146个

财富等级: 日进斗金

 楼主| 发表于 2014-8-31 08:43:03 | 显示全部楼层
本帖最后由 lgx9612 于 2014-8-31 08:52 编辑
st788796 发表于 2014-8-31 07:13
看到楼主这样用 Autolisp  忍不住说几句,在 Autocad 下计算和几何要结合起来运用

1 不能有重复点

谢谢高人指点.下面的判断似乎没有判断p2通过点。(if (< (setq ean (angle p p3)) (setq san (angle p p1)))
            (list p r san (+ pi pi ean))
            (list p r san ean)
          )


点评

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

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-8-31 09:05:10 来自手机 | 显示全部楼层
lgx9612 发表于 2014-8-31 08:43
谢谢高人指点.下面的判断似乎没有判断p2通过点。(if (< (setq ean (angle p p3)) (setq san (angle p p1) ...

中垂线交点存在就有圆心,自然过p2

点评

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

使用道具 举报

已领礼包: 146个

财富等级: 日进斗金

 楼主| 发表于 2014-8-31 09:09:20 | 显示全部楼层
csharp 发表于 2014-8-31 09:05
中垂线交点存在就有圆心,自然过p2

我说角度的起始角与终止角要根据p2在p1和p3位置来判断

点评

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

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-8-31 09:18:44 来自手机 | 显示全部楼层
lgx9612 发表于 2014-8-31 09:09
我说角度的起始角与终止角要根据p2在p1和p3位置来判断

函数 的 参数 顺序已经决定了,你自己在cad中画一画

点评

看来你已经在cad中画过了,你可以把点选点的顺序反过来试一下就知道出错了.  详情 回复 发表于 2014-8-31 11:20
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 146个

财富等级: 日进斗金

 楼主| 发表于 2014-8-31 11:20:52 | 显示全部楼层
csharp 发表于 2014-8-31 09:18
函数 的 参数 顺序已经决定了,你自己在cad中画一画

   看来你已经在cad中画过了,你可以把点选点的顺序反过来试一下就知道出错了.

点评

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

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-8-31 11:26:51 来自手机 | 显示全部楼层
本帖最后由 csharp 于 2014-8-31 11:30 编辑
lgx9612 发表于 2014-8-31 11:20
看来你已经在cad中画过了,你可以把点选点的顺序反过来试一下就知道出错了.


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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-9-11 13:09:50 来自手机 | 显示全部楼层
用xdrxapi的 Ge 函数可以直接构造3点Arc,然后XDGe::Entity:make为AcDb或提取参数均可
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2014-9-11 17:18:36 | 显示全部楼层
st788796 发表于 2014-8-31 07:13
看到楼主这样用 Autolisp  忍不住说几句,在 Autocad 下计算和几何要结合起来运用

1 不能有重复点

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

使用道具 举报

发表于 2014-9-11 18:02:28 | 显示全部楼层
本帖最后由 Free-Lancer 于 2014-9-11 18:03 编辑

这个可以
  1. (defun Arc:3pMake (p1 p2 p3 / r d an p pc sa se midp)
  2.   (defun midp (p1 p2)
  3.     (mapcar '(lambda (x y)
  4.                (* 0.5 (+ x y))
  5.              )
  6.             p1
  7.             p2
  8.     )
  9.   )
  10.   (setq        d    (car (trans (mapcar '- p2 p1) 0 (mapcar '- p3 p1)))
  11.         an   (angle p1 p3)
  12.         _pi2 (/ pi 2)
  13.         p11  (midp p1 p2)
  14.         p22  (midp p2 p3)
  15.   )
  16.   (if (setq pc (inters p11
  17.                        (polar p11 (+ (angle p1 p2) _pi2) 1.)
  18.                        p22
  19.                        (polar p22 (+ (angle p2 p3) _pi2) 1.)
  20.                        nil
  21.                )
  22.       )
  23.     (progn
  24.       (setq r  (distance p1 pc)
  25.             sa (angle pc p1)
  26.             se (angle pc p3)
  27.       )
  28.       (if (minusp d)
  29.         (if (and (< sa se) (< (angle pc p2) sa))
  30.           (vlax-invoke (fy:acspace) 'AddArc pc r se (+ pi pi sa))
  31.           (vlax-invoke (fy:acspace) 'AddArc pc r sa se)
  32.         )
  33.         (if (< se (angle pc p2) sa) ;_顺时针
  34.           (vlax-invoke (fy:acspace) 'AddArc pc r se sa)
  35.           (vlax-invoke (fy:acspace) 'AddArc pc r se (+ pi pi sa))
  36.         )
  37.       )
  38.     )
  39.   )
  40. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-9-11 18:07:34 | 显示全部楼层
本帖最后由 st788796 于 2014-9-11 22:58 编辑

用 Ge 库就这样
  1. (defun 3parc (p1 p2 p3 / e info)
  2.   (if (setq e (XDGe::Constructor "kCircArc3d" p1 p2 p3))
  3.     (progn
  4.       (setq info (list (XdGe::Getpropertyvalue e "Center")
  5.                        (xdGe::Getpropertyvalue e "Radius")
  6.                        (xdGe::getpropertyvalue e "startAng")
  7.                        (xdGe::getpropertyvalue e "endAng")
  8.                  )
  9.       )
  10.       (xdge::free e)
  11.       info
  12.     )
  13.   )
  14. )

点评

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2014-9-11 23:42:29 | 显示全部楼层

可以更简化

  1. (defun 3parc (p1 p2 p3 / e info)
  2.   (if (setq e (XDGe::Constructor "kCircArc3d" p1 p2 p3))
  3.     (progn
  4.       (setq info (XdGe::Getpropertyvalue e "Center" "Radius" "startAng" "endAng"))
  5.       (xdge::free e)
  6.       info
  7.     )
  8.   )
  9. )

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-18 17:08 , Processed in 0.512315 second(s), 61 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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