vken7az2p 发表于 2007-2-15 23:12:00

[原创][讨论]:[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 (&gt; A 180)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&gt; A B)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&lt; B 180))<br/>(SETQ ANG (+ B (- 360 A) ))<br/>)</p><p>((AND (&lt; A 180)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&lt; A B)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&gt; B 180))<br/>(SETQ ANG (+ (- B 180) (- 180 A) ))<br/>)<br/>((AND (&gt; A 180)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&gt; A B)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&gt; B 180))<br/>(SETQ ANG (+ B (- 360 A) ))<br/>) <br/>((AND (&lt; A 180)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&lt; A B)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&lt; B 180))<br/>(SETQ ANG (- B A))<br/>)&nbsp;&nbsp;&nbsp; <br/>((AND (&lt; A 180)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&gt; A B)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&lt; B 180))<br/>(SETQ ANG (- A B))<br/>)<br/>((AND (&gt; A 180)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&lt; A B)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&gt; 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>

无痕 发表于 2007-2-16 06:12:00

不知道可不可以,没仔细想:

;| (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))
)

aphey 发表于 2007-2-28 02:01:00

<p>ANG=B-A</p><p>IF&nbsp;ANG &lt; 0 THEN ANG = ANG + 360</p><p>这一句判断应该就足够了吧&nbsp;</p>

byghbcx 发表于 2007-2-28 09:39:00

<p>就是,一句就足够了,一楼的程序实际上就是一个判断,他分别就a&lt;b,a&gt;b的两种情况下分别列出了a&lt;180,b&lt;180;a&lt;180,b&gt;180;a&gt;180,b&gt;180三种情况,但最后的setq还是一样的.</p><p>试试</p><p>(DEFUN CCW_ANG&nbsp;(/ p1 p2 p3 A B)</p><p>&nbsp; (setvar "cmdecho" 0)<br/>&nbsp; (setq p1 (getpoint "\n起点:"))<br/>&nbsp; (setq p2 (getpoint "\n中点:"))<br/>&nbsp; (setq p3 (getpoint "\n终点:"))<br/>&nbsp; (setq A (ANGLE P2 P1))<br/>&nbsp; (setq B (ANGLE P2 P3))<br/>&nbsp; (command "_.line" p1 p2 p3 "")<br/>&nbsp; (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/>&nbsp; (COND<br/>&nbsp;&nbsp;&nbsp; ((&gt; A B)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (SETQ ANG (+ B (- (* 2 pi) A)))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; ((&lt; A B)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (SETQ ANG (- B A))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp; (T NIL)<br/>&nbsp;&nbsp;&nbsp; )<br/>&nbsp; (setq ANG (angtos ang 0))<br/>&nbsp; (PRINc (strcat "\n三点逆时针角度:" ang "度"))</p><p>&nbsp; (setvar "cmdecho" 1)<br/>)</p>
页: [1]
查看完整版本: [原创][讨论]:[0215]三点求逆时针角度