[原创][讨论]:[0215]三点求逆时针角度
本帖最后由 作者 于 2007-2-15 23:14:06 编辑 <br /><br /> <p><br/></p><p>写了一个三点求逆时针方向角度<br/>想请讨论一下是否有更方便的计算方法</p><p>附上图片及程序</p><p>(DEFUN CCW_ANG ( p1 p2 p3 / A B )<br/>(setq A (RTOD (ANGLE P2 P1)))<br/>(setq B (RTOD (ANGLE P2 P3)))<br/>(COND<br/>((AND (> A 180)<br/> (> A B)<br/> (< B 180))<br/>(SETQ ANG (+ B (- 360 A) ))<br/>)</p><p>((AND (< A 180)<br/> (< A B)<br/> (> B 180))<br/>(SETQ ANG (+ (- B 180) (- 180 A) ))<br/>)<br/>((AND (> A 180)<br/> (> A B)<br/> (> B 180))<br/>(SETQ ANG (+ B (- 360 A) ))<br/>) <br/>((AND (< A 180)<br/> (< A B)<br/> (< B 180))<br/>(SETQ ANG (- B A))<br/>) <br/>((AND (< A 180)<br/> (> A B)<br/> (< B 180))<br/>(SETQ ANG (- A B))<br/>)<br/>((AND (> A 180)<br/> (< A B)<br/> (> B 180))<br/>(SETQ ANG (- B A))<br/>)</p><p>(T NIL)<br/>)<br/>ANG<br/>)</p><p>测试:<br/>(setq p1 (getpoint "\n起点:"))<br/>(setq p2 (getpoint "\n中点:"))<br/>(setq p3 (getpoint "\n终点:"))<br/>(PRINT (CCW_ANG p1 p2 p3))</p><p>如:<br/>由点 B R C 则返回 角度100<br/>由点 C R B 则返回 角度260</p><p></p><p>http://img11.picsplace.to/img10/22/C960215.JPG</p> 不知道可不可以,没仔细想:;| (acan p1 p2 p3) = 求3点逆时针角度.----by lxx.2007.2
参数: p1 p2 p3 点. p2为角点.
返回: 弧度角.
|;
(defun acan (p1 p2 p3 / ans a b an)
(setq ans (list(angle p1 p2)(angle p3 p2))
a (apply 'min ans)
b (apply 'max ans)
an (- b a))
(if (= a (car ans))
an
(- (* 2 PI) an)
)
)测试:(defun c:tt()
(setq p1 (getpoint "1:")
p2 (getpoint "2:")
p3 (getpoint "3:"))
(* 180(/(acan p1 p2 p3)PI))
) <p>ANG=B-A</p><p>IF ANG < 0 THEN ANG = ANG + 360</p><p>这一句判断应该就足够了吧 </p> <p>就是,一句就足够了,一楼的程序实际上就是一个判断,他分别就a<b,a>b的两种情况下分别列出了a<180,b<180;a<180,b>180;a>180,b>180三种情况,但最后的setq还是一样的.</p><p>试试</p><p>(DEFUN CCW_ANG (/ p1 p2 p3 A B)</p><p> (setvar "cmdecho" 0)<br/> (setq p1 (getpoint "\n起点:"))<br/> (setq p2 (getpoint "\n中点:"))<br/> (setq p3 (getpoint "\n终点:"))<br/> (setq A (ANGLE P2 P1))<br/> (setq B (ANGLE P2 P3))<br/> (command "_.line" p1 p2 p3 "")<br/> (command "_.arc" "c" p2 (polar p2 A (/ (+ (distance p2 p1) (distance p2 p3)) 10)) (polar p2 B (/ (+ (distance p2 p1) (distance p2 p3)) 10)))<br/> (COND<br/> ((> A B)<br/> (SETQ ANG (+ B (- (* 2 pi) A)))<br/> )<br/> ((< A B)<br/> (SETQ ANG (- B A))<br/> )<br/> (T NIL)<br/> )<br/> (setq ANG (angtos ang 0))<br/> (PRINc (strcat "\n三点逆时针角度:" ang "度"))</p><p> (setvar "cmdecho" 1)<br/>)</p>
页:
[1]