linshiyin2 发表于 2010-5-29 18:26:00

[求助]如何画出圆弧的两个切线

<p></p>
<p>已知一个多段线的圆弧,如何画出切线部分?(蓝色的两条直线),请高人给出lisp,多谢</p>

技术工作室 发表于 2023-10-3 19:33:29

正是我想要的,赞一个

linshiyin2 发表于 2010-5-29 18:46:00

<p>给点帮助</p>
<p><font face="Verdana">;;;<br/>;;;选择并计算曲线参数函数DimSelqx<br/>;;;返回值:曲线参数(alfa[弧度] R)<br/>;;;<br/>(defun DimSelqx( / wh ss ssLen i alfa R Ename vdata N p1 p2 bulge alfai XL Ri)</font></p>
<p><font face="Verdana">&nbsp; (setq wh 1&nbsp; ss nil)<br/>&nbsp; (while (and (= wh 1) (setq ss (ssget '((0 . "LWPOLYLINE")))) ) <br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq ssLen (sslength ss))<br/>&nbsp;&nbsp;&nbsp;&nbsp; (setq i 0&nbsp; wh 0&nbsp; R 0&nbsp; alfa 0)<br/>&nbsp;&nbsp;&nbsp;&nbsp; (while (and (= wh 0) (&lt; i ssLen))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq Ename (ssname ss i))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq vdata (entget Ename))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq N (length vdata))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq p1 (cdr (nth (- N 9) vdata))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;第一个顶点<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p2 (cdr (nth (- N 5) vdata)))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ;第二个顶点<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq bulge (cdr (nth (- N 6) vdata)))&nbsp;&nbsp; ;第一个顶点凸度<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (/= bulge 0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn (setq alfai (* 4 (atan (abs bulge)))&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XL (distance p1 p2)&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; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ri (ccfix (/ (/ XL 2) (sin (/ alfai 2))) 0)) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (and (/= R Ri) (/= i 0))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn (redraw Ename 3)<br/>&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; (alert "曲线半径不同,请重新选择!")<br/>&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; (redraw Ename 4)<br/>&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; (setq wh 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq alfa (+ alfai alfa)&nbsp;&nbsp; R&nbsp; Ri)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (progn (redraw Ename 3)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (alert "虚显的巷道是直线,请重新选择!")<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (redraw Ename 4)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq wh 1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (setq i (1+ i))<br/>&nbsp;&nbsp;&nbsp;&nbsp; )<br/>&nbsp; )<br/>&nbsp; (if (not ss) (exit) )<br/>&nbsp; (setq ss nil)<br/>&nbsp;&nbsp; <br/>&nbsp; (list alfa R)</font></p>
<p><font face="Verdana">);End DimSelqx</font></p>

linshiyin2 发表于 2010-5-31 08:47:00

沉的好快,自己顶顶,有哪位大侠给指点一下啊

sailorcwx 发表于 2010-5-31 15:48:00

<p>求出圆心,然后求出圆心和切点的角度,然后。。。。。出来了吧</p>

linshiyin2 发表于 2010-5-31 16:31:00

<p>楼上的,我不会做啊,能给个lisp吗</p>

xianaihua 发表于 2010-5-31 18:02:00

我这有一个程序,你可试试

;虚拟交点的绘制
(defun C:XNJD (/ p1 p2 p3 p4 p5)
(setvar "cmdecho" 0)
(setq p1 (entsel "\n选取一段圆弧: "))
(if p1
    (progn (setq p0 (entget (car p1)))
    (setq p1 (cdr (assoc 0 p0)))
    )
)
(if (/= p1 "ARC")
    (prompt "\n选择的不是圆弧,请再试...")
)
(setq p1 (polar (cdr (assoc 10 p0))
    (cdr (assoc 50 p0))
    (cdr (assoc 40 p0))
    )
p2 (polar (cdr (assoc 10 p0))
    (cdr (assoc 51 p0))
    (cdr (assoc 40 p0))
    )
p3 (polar p1
    (+ (/ pi 2) (cdr (assoc 50 p0)))
    (cdr (assoc 40 p0))
    )
p4 (polar p2
    (+ (/ pi 2) (cdr (assoc 51 p0)))
    (cdr (assoc 40 p0))
    )
p5 (inters p1 p3 p2 p4 nil)
)
(if (not p5)
    (prompt "\n没有交点...")
    (progn
      (if (> (distance p1 p5)
      (* 2 (getvar "dimscale") (getvar "dimexo"))
   )
(command
   "_.line"
   (polar p1
   (angle p1 p5)
   (* (getvar "dimexo") (getvar "dimscale"))
   )
   (polar p5
   (angle p1 p5)
   (* (getvar "dimexe") (getvar "dimscale"))
   )
   ""
   "_.line"
   (polar p2
   (angle p2 p5)
   (* (getvar "dimexo") (getvar "dimscale"))
   )
   (polar p5
   (angle p2 p5)
   (* (getvar "dimexe") (getvar "dimscale"))
   )
   ""
)
(command
   "_.line"
   (polar p1 (angle p1 p5) (* 0.5 (distance p1 p5)))
   (polar p5
   (angle p1 p5)
   (* (getvar "dimexe") (getvar "dimscale"))
   )
   ""
   "_.line"
   (polar p2 (angle p2 p5) (* 0.5 (distance p2 p5)))
   (polar p5
   (angle p2 p5)
   (* (getvar "dimexe") (getvar "dimscale"))
   )
   ""
)
      )
    )
)
(princ)
)

狂刀无痕 发表于 2010-6-1 00:23:00

<p>一个偏门的方法:</p>
<p>(command "fillet" "r" 0. "p" 选pl线)</p>
<p>&nbsp;</p>

linshiyin2 发表于 2010-6-1 08:27:00

<p>楼上的偏方倒是可以,但是,我要的是另外两条切线,用倒角的话会延长这两条线,而不是画两条新的切线,不过还是非常感谢你哦,这个思路也行,就是通过两条边画这个焦点切线</p>

linshiyin2 发表于 2010-6-1 08:30:00

感谢<font color="#61b713" face="Verdana"><b>xianaihua问题是你的针对是圆弧,我这个是多段线构成的圆弧,怎么样修改一下你的程序呢,还有你的程序实际使用时,圆弧下凸就会有多余的部分,p3点计算出错</b></font>

wzs07 发表于 2010-6-1 08:52:00

以上的代码不错啊
页: [1] 2
查看完整版本: [求助]如何画出圆弧的两个切线