河伯 发表于 2010-10-28 16:49:00

[求助]圆弧求解问题,请指教!

<font face="Verdana">已知直线一的起终点P1和P2,直线二的起终点P1和P3,以及任一点P,<br/>求与两直线相切且通过P点的圆弧,求得半径、切线长或圆心坐标均可。<br/>请高手指点一下思路。</font>

highflybird 发表于 2010-10-28 17:36:00

<p>你可是要算法还是画法,画法很简单,采用三点画圆,</p>
<p><font face="Verdana">Command: c CIRCLE Specify center point for circle or : 3p Specify first point on circle: tan to&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&gt;第一条线相切<br/>Specify second point on circle: tan to&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;第二条线相切<br/>Specify third point on circle:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;所经过的点</font></p>

河伯 发表于 2010-10-28 19:03:00

想要算法,lisp或.NET的算法都可以。

chenjun_nj 发表于 2010-10-28 21:40:00

尺规作图法:<br/>

qjchen 发表于 2010-10-28 22:26:00

:) to chenjun兄,理论上应该是有双解~,不过当然楼主可能只希望这一种就可以了,这个应该可以编成lisp的,我来试试看 :)

461045462 发表于 2010-10-28 23:33:00

<p>关注着进展</p>
<p>请问:从1楼说的条件看,p1、P2、p3、p都是已知的,也就是说是有坐标值的了。对吗?</p>
<p>如果是,利用三角函数解是否交佳?</p>
<p>一点想法。见笑</p>
<p>&nbsp;期待早日有结果</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>

Andyhon 发表于 2010-10-29 16:26:00

依 highflybird 老师 ....


;;; No error trap for test only
(defun C:test ()
   (setq e1 (entsel "\nSelect Line a: ")
         e2 (entsel "\nSelect Line b: ")
         pt (getpoint "Point 'P': " )
   )
   (command "Circle" "3p" "tan" (cadr e1) "tan" (cadr e2) pt)
   (setq ee (entlast)
      Dat (entget ee)
      Ctr (cdr (assoc 10 Dat))      ; 圆心
      Rad (cdr (assoc 40 Dat))      ; 半径
   )
)








qjchen 发表于 2010-10-29 20:04:00

[讨论] 分割正3-22边形,拼接成正方形

:) ,Highflybird兄和Andyhon兄的做法无疑漂亮而直接

本来想用chenjun兄的思路编个lisp的,不过后来遇到需求圆和直线的交点,就暂停了。

于是利用此贴 http://bbs.mjtd.com/forum.php?mod=viewthread&tid=80843&star=1#31199

中的二分法做法(才发现也是向andyhon兄探讨过的问题),写了如下一段冗长的代码,近似法,倒是可以用在某些约束求解的场合。见笑了。




;;;;;;;;;;;;;;;;;half search core function
(defun searchhalf(f neg-point pos-point / midpoint test-value)
;(setq midpoint (mapcar '(lambda(x y) (/ (+ x y) 2)) neg-point pos-point))
(setq midpoint (/ (+ neg-point pos-point) 2))

(cond
    ((close-enough? neg-point pos-point) midpoint)
    (T (setq test-value ((eval f) midpoint))
       (cond
   ((> test-value 0) (searchhalf f neg-point midpoint))
   ((< test-value 0) (searchhalf f midpoint pos-point))
   (T midpoint)
       )
    )
)
)
(defun close-enough?(x y)
(< (abs (- x y)) 0.00001)
)
(defun halfsolve(f a b / a-value b-value)
(setq a-value ((eval f) a) b-value ((eval f) b))

(cond
((and (< a-value 0) (> b-value 0)) (searchhalf f a b))
((and (> a-value 0) (< b-value 0)) (searchhalf f b a))
((= a-value 0) a)
((= b-value 0) b)
(T (prompt "The Values are not between a and b"))
)
)
;;;;;;;;entmake circle
(defun entmakecircle(cen r layer)
(entmake (list (cons 0 "CIRCLE") ;***
            (cons 6 "BYLAYER")
            (cons 8 layer)
            (cons 10 cen) ;***
            (cons 39 0.0)
            (cons 40 r) ;***
            (cons 62 256)
            (cons 210 (list 0.0 0.0 1.0)
            )))
)
;;;;;function to be solved
(defun caldis(x)
(- (* (sin (abs (/ a23 2.0))) x) (distance (polar p1 a23half x) p))
)
;;;Main function 二分法近似绘制圆过某点切两直线
(defun c:test( / a12 a13 a23 a23half dis1 p p1 p2 p3 r r1)
(setq p1 (getpoint "\np1") p2 (getpoint "\np2") p3 (getpoint "\np3") p (getpoint "\np"))
(setq a12 (angle p1 p2) a13 (angle p1 p3))
(if (< a13 a12) (setq a13 (+ a13 (* 2 pi))))
(setq a23 (- a13 a12) a23half (+ a12 (/ a23 2.0)))
(setq dis1 (distance p1 p))
(setq r (halfsolve caldis 0.0 dis1))
(setq r1 (halfsolve caldis dis1 (* dis1 50)))
(entmakecircle (polar p1 a23half r) (distance (polar p1 a23half r) p) "0")
(entmakecircle (polar p1 a23half r1) (distance (polar p1 a23half r1) p) "0")
(princ)
)
(princ)
(princ "\n 华南理工大学 qjchen,命令:test")
(princ)

河伯 发表于 2010-11-1 16:09:00

<p><font face="Verdana">谢谢各位高手相助!</font></p>
<p><font face="Verdana">To Andyhon:因条件中没有</font>直线对象,故(command)函数不适用本例。</p>
<p><font face="Verdana">To qjchen</font>:程序适用,具体实现中只需一个大半径圆弧,待我简化一下。</p>

chenjun_nj 发表于 2010-11-1 22:41:00

既然知道4个点的坐标,直接解方程求出圆心坐标不就可以了.
页: [1] 2
查看完整版本: [求助]圆弧求解问题,请指教!