找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 737|回复: 0

[讨论]:[0817]如何判断A角度是否B角度逆时针区间中?

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

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

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

×
[讨论]:[0817]如何判断A角度是否B角度逆时针区间中?
小弟写了一个函数,
设基准角为 PR 其中 +PR 逆时针角度为 -PR ,
另设对照角为 SU,
若 SU 并非为 +PR 至 -PR 之间的角度值时, 回传 NIL , 反之传回 1 .

遇到了一个问题就是关於精度值问题,
如:
(ang-side (DTOR 270) (DTOR 269.9999999999999))
_$ 1
(ang-side (DTOR 270) (DTOR 269.99999999999999))
_$ nil

如果为这样的话,
应该回传结果要相同,
但却不同,不知道哪出错了,
另外也请各位高手可以测试一下
看看这函数是否有其他问题.

谢谢~

TEST:
(ang-side (* pi 2) 0)  
_$ nil
(ang-side (* pi 2) (/ pi 2))
_$ nil
(ang-side (* pi 2) pi)
_$ nil
(ang-side (* pi 2) (* pi 1.5))
_$ 1
(Sang-side (* pi 2) (* pi 2))
_$ nil


  1. ;;判断A角度是否B角度逆时针区间中
  2. (defun ang-side
  3. (pr_ang su_ang / pr_ang_st pr_ang_ed pr_ang_st_ch pr_ang_ed_ch)
  4. (setq pr_ang (RTOD pr_ang))
  5. (setq su_ang (RTOD su_ang))
  6. (if (> pr_ang 360.0)
  7. (setq pr_ang (abs (- pr_ang (* (fix (/ pr_ang 360.0))360))))
  8. ) ;超出360检测
  9. (if (> su_ang 360.0)
  10. (setq su_ang (abs (- su_ang (* (fix (/ su_ang 360.0))360))))
  11. )
  12. (if (<= pr_ang 180.0)
  13. (progn
  14. (if (= pr_ang 180.0)
  15.     (progn
  16. (setq pr_ang_ed_ch 0.0)
  17. (setq pr_ang_st_ch pr_ang)
  18. ) ;_ 结束progn
  19.     (progn
  20. (setq pr_ang_ed_ch (+ (- pr_ang 180.0) 360.0))
  21. (setq pr_ang_st_ch pr_ang)
  22. ) ;_ 结束progn
  23.     ) ;_ 结束if
  24. ) ;_ 结束progn
  25. (progn
  26. (if (= pr_ang 360.0)
  27.     (progn
  28. (setq pr_ang_ed_ch 180.0)
  29. (setq pr_ang_st_ch pr_ang)
  30. ) ;_ 结束progn
  31.     (progn
  32. (setq pr_ang_ed_ch (- pr_ang 180.0))
  33. (setq pr_ang_st_ch pr_ang)
  34. ) ;_ 结束progn
  35.     ) ;_ 结束if
  36. ) ;_ 结束progn
  37. ) ;_ 结束IF
  38. ;;设定正逆界线角度
  39. (cond
  40. ((< pr_ang 180.0)
  41. (setq pr_ang_ed (- (+ (- pr_ang 180.0) 360.0) 0.1e-16))
  42. (setq pr_ang_st (- pr_ang 0.1e-16))
  43. )
  44. ((> pr_ang 180.0)
  45. (setq pr_ang_ed (- (- pr_ang 180.0) 0.1e-16))
  46. (setq pr_ang_st (- pr_ang 0.1e-16))
  47. )
  48. ((= pr_ang 0.0)
  49. (setq pr_ang_ed (- 180.0 0.1e-16))
  50. (setq pr_ang_st (+ pr_ang 0.1e-16))
  51. )
  52. ((= pr_ang 180.0)
  53. (setq pr_ang_ed (+ 0.0 0.1e-16))
  54. (setq pr_ang_st (- pr_ang 0.1e-16))
  55. )
  56. ((= pr_ang 360.0)
  57. (setq pr_ang_ed (- 180.0 0.1e-16))
  58. (setq pr_ang_st (- pr_ang 0.1e-16))
  59. )
  60. ) ;_cond
  61. ;判断角度 1 & nil
  62. (cond
  63. ((= su_ang pr_ang_st_ch)
  64. (setq ang:ans nil ) );等角为nil
  65. ((= su_ang pr_ang_ed_ch)
  66. (setq ang:ans nil ) );对角为nil

  67. ((or (and (= su_ang 0.0)(= pr_ang 360.0))
  68.      (and (= su_ang 360.0)(= pr_ang 0.0)))
  69. (setq ang:ans nil ) );对角为nil

  70. ((and (< su_ang 180.0) (<= pr_ang 180.0))
  71. (if (< su_ang pr_ang_st)
  72.     (setq ang:ans 1 )
  73.     (setq ang:ans nil )
  74.     )
  75. )
  76. ((and (< su_ang 180.0) (> pr_ang 180.0))
  77. (if (> su_ang pr_ang_ed )
  78.     (setq ang:ans 1 )
  79.     (setq ang:ans nil )
  80.     )
  81. )
  82. ((and (> su_ang 180.0) (< pr_ang 180.0))
  83. (if (> su_ang pr_ang_ed )
  84.     (setq ang:ans 1 )
  85.     (setq ang:ans nil )
  86.     )
  87. )
  88. ((and (> su_ang 180.0) (> pr_ang 180.0))
  89. (if (< su_ang pr_ang_st)
  90.     (setq ang:ans 1 )
  91.     (setq ang:ans nil )
  92.     )
  93. )
  94. (t nil)
  95. ) ;_cond
  96. ang:ans
  97. ) ;_defun

  98. (defun dtor (dang)
  99.     (* dang (/ pi 180))
  100. )

  101. (defun rtod (rang)
  102.     (* rang (/ 180 pi))
  103. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-18 13:59 , Processed in 0.191273 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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