明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1428|回复: 3

[原创][讨论]:[0215]三点求逆时针角度

[复制链接]
发表于 2007-2-15 23:12 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2007-2-15 23:14:06 编辑


写了一个三点求逆时针方向角度
想请讨论一下是否有更方便的计算方法

附上图片及程序

(DEFUN CCW_ANG ( p1 p2 p3 / A B )
(setq A (RTOD (ANGLE P2 P1)))
(setq B (RTOD (ANGLE P2 P3)))
(COND
((AND (> A 180)
      (> A B)
      (< B 180))
(SETQ ANG (+ B (- 360 A) ))
)

((AND (< A 180)
      (< A B)
      (> B 180))
(SETQ ANG (+ (- B 180) (- 180 A) ))
)
((AND (> A 180)
      (> A B)
      (> B 180))
(SETQ ANG (+ B (- 360 A) ))
)
((AND (< A 180)
      (< A B)
      (< B 180))
(SETQ ANG (- B A))
)   
((AND (< A 180)
      (> A B)
      (< B 180))
(SETQ ANG (- A B))
)
((AND (> A 180)
      (< A B)
      (> B 180))
(SETQ ANG (- B A))
)

(T NIL)
)
ANG
)

测试:
(setq p1 (getpoint "\n起点:"))
(setq p2 (getpoint "\n中点:"))
(setq p3 (getpoint "\n终点:"))
(PRINT (CCW_ANG p1 p2 p3))

如:
由点 B R C 则返回 角度100
由点 C R B 则返回 角度260

发表于 2007-2-16 06:12 | 显示全部楼层
不知道可不可以,没仔细想:
  1. ;| (acan p1 p2 p3) = 求3点逆时针角度.----by lxx.2007.2
  2. 参数: p1 p2 p3 点. p2为角点.
  3. 返回: 弧度角.
  4. |;
  5. (defun acan (p1 p2 p3 / ans a b an)
  6.   (setq ans (list(angle p1 p2)(angle p3 p2))
  7. a (apply 'min ans)
  8. b (apply 'max ans)
  9. an (- b a))
  10.   (if (= a (car ans))
  11.     an
  12.     (- (* 2 PI) an)
  13.   )
  14. )
测试:
  1. (defun c:tt()
  2.   (setq p1 (getpoint "1:")
  3. p2 (getpoint "2:")
  4. p3 (getpoint "3:"))
  5.   (* 180(/(acan p1 p2 p3)PI))
  6. )
发表于 2007-2-28 02:01 | 显示全部楼层

ANG=B-A

IF ANG < 0 THEN ANG = ANG + 360

这一句判断应该就足够了吧 

发表于 2007-2-28 09:39 | 显示全部楼层

就是,一句就足够了,一楼的程序实际上就是一个判断,他分别就a<b,a>b的两种情况下分别列出了a<180,b<180;a<180,b>180;a>180,b>180三种情况,但最后的setq还是一样的.

试试

(DEFUN CCW_ANG (/ p1 p2 p3 A B)

  (setvar "cmdecho" 0)
  (setq p1 (getpoint "\n起点:"))
  (setq p2 (getpoint "\n中点:"))
  (setq p3 (getpoint "\n终点:"))
  (setq A (ANGLE P2 P1))
  (setq B (ANGLE P2 P3))
  (command "_.line" p1 p2 p3 "")
  (command "_.arc" "c" p2 (polar p2 A (/ (+ (distance p2 p1) (distance p2 p3)) 10)) (polar p2 B (/ (+ (distance p2 p1) (distance p2 p3)) 10)))
  (COND
    ((> A B)
     (SETQ ANG (+ B (- (* 2 pi) A)))
     )
    ((< A B)
     (SETQ ANG (- B A))
     )
    (T NIL)
    )
  (setq ANG (angtos ang 0))
  (PRINc (strcat "\n三点逆时针角度:" ang "度"))

  (setvar "cmdecho" 1)
)

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-22 04:06 , Processed in 0.310620 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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