awaken 发表于 2006-6-23 15:16:00

两圆相交

<P>两圆相交,如何用LISP来捕捉交点?以前曾见到这样一个题,给出三角形三边长让画出这个三角形,正常做图时要做两个圆做辅助线,当然,也有的人是算出来数据后画的。如果用LISP算着当然也不成问题,但如果想不算,先画出一线两圆,再捕捉交点,以交点为点画线。但我却遇到一个问题,就是不知道如何捕捉交点,它有两个交点,应该怎么解决?还请高手指点:</P>
<P>我写的程序是(不过运行结果不正确还请高手帮忙解决一下):<BR>(defun iadd();选择集的应用。<BR>&nbsp; (setq ss(ssadd(entlast)))<BR>)<BR>(defun c:aaaa()<BR>&nbsp; (setq p(getpoint "\n基点:")<BR>&nbsp;x(car p) y(cadr p)<BR>&nbsp;&nbsp;&nbsp; &nbsp;a(getdist "\n第一条线段长:")<BR>&nbsp;b(getdist "\n第二条线段长:")<BR>&nbsp;c(getdist "\n第三条线段长:")<BR>&nbsp;p1(list (+ x a) y)<BR>&nbsp; )<BR>&nbsp; (vl-cmdf "line" p p1 "") <BR>&nbsp; (vl-cmdf "circle" p b "")(iadd)<BR>&nbsp; (vl-cmdf "circle" p1 c "")(iadd)<BR>&nbsp; (vl-cmdf "line" p (osnap ss "_int") p1 "") ;捕捉交点<BR>&nbsp; (vl-cmdf "erase" ss "" );把两圆删除<BR>&nbsp; (vl-cmdf "zoom" "e")<BR>)</P>

vken7az2p 发表于 2006-6-24 17:25:00

<P>&nbsp;看看吧~不知道是不是你要的~</P>
<P>(setq pp1 (getpoint "\n 第1点:" ))<BR>(setq cd1 (getdist "\n 第1点半径:" ))<BR>(command "_.circle" pp1 cd1&nbsp; ) <BR>(setq circ1 (vlax-ename-&gt;vla-object (entlast )))</P>
<P>(setq pp2 (getpoint pp1 "\n 第2点" ))<BR>(setq cd2 (getdist "\n 第2点半径:" ))<BR>(command "_.circle" pp2 cd2&nbsp; ) <BR>(setq circ2 (vlax-ename-&gt;vla-object (entlast )))</P>
<P>(setq int_points (vlax-invoke circ1 'Intersectwith circ2 acextendnone))<BR>;;求出两圆交点,產生共两组资料</P>

awaken 发表于 2006-6-24 18:09:00

<P>那如果想用这两组资料怎么用呀?我是新手,还请高手不吝赐教。</P>

vken7az2p 发表于 2006-6-25 11:16:00

你在试试这完成的程序吧
不过不知道是不是你要的

(defunc:test ()
(setq en (car(entsel "\n 选三角形底边线:"))
      ob (entget en)
   ob-10 (cdr(ASSOC 10 ob))
   ob-11 (cdr(ASSOC 11 ob))
)
(setq pt (getpoint "\n 设三角形顶点位置:"))
(setq dt (DISTANCE ob-10 ob-11))
(setq vla-obj (vlax-ename->vla-object en))
(setq cd1 (getdist "\n 三角形第1斜边距离距离:" ))
(command "_.circle" ob-10 cd1 )
(setq circ1 (vlax-ename->vla-object (entlast )))
(setq cd2 (getdist "\n 三角形第2斜边距离距离:" ))
(command "_.circle" ob-11 cd2)
(setq circ2 (vlax-ename->vla-object (entlast)))
(setq int_points (vlax-invoke circ1 'Intersectwith circ2 acextendnone))
(setq pt_list nil)
(while (caddr int_points)
(setq pt_list (cons (list (car int_points) (cadr int_points) (caddr int_points)) pt_list )
   int_points (cdddr int_points)
))
(vla-delete circ1)
(vla-delete circ2)
(if (< (distance (nth 0 pt_list) pt ) (distance (nth 1 pt_list) pt ) )
    (setq pp4 (nth 0 pt_list) )
    (setq pp4 (nth 1 pt_list) )
)
(vl-cmdf "line" ob-10 "non" pp4 "")
(vl-cmdf "line" ob-11 "non" pp4 "")
)

awaken 发表于 2006-6-26 07:38:00

果然是高手,谢谢呀!
页: [1]
查看完整版本: 两圆相交