明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2875|回复: 8

两圆的共切线

[复制链接]
发表于 2005-11-11 12:57:00 | 显示全部楼层 |阅读模式

我想编一个绘制两个圆共切线的程序。

这个程序我编了一半了,有一个问题不知道怎么解决,就是以知一个点,和一个最后生成的圆,我想从这个以知点做圆的切线,不知道怎么做。

“osnap”这个命令不知道能不能行呀。

请高手指点一二。

如果那位高手能把程序发上来,小弟不甚感激。在此先谢过了。

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2005-11-14 20:27:00 | 显示全部楼层
;两圆的外公切线
(defun c:cc()
   (setq xtblm '("cmdecho" "osmode")
  xtblz (mapcar 'getvar xtblm)
   )
   (mapcar 'setvar xtblm '(0 0))
   (while (progn (setq en1 (entsel "\n请选取第一个圆:"))
          (not (if (= en1 nil)
           nil
                  (= (cdr (assoc 0 (entget (car en1)))) "CIRCLE"))
   )
   )
          (princ "\n你选取的不是圆或者未选取任何图元,请重新选取第一个圆!")
   )
   (while (progn (setq en2 (entsel "\n请选择第二个圆:"))
          (not (if (= en2 nil)
           nil
                  (= (cdr (assoc 0 (entget (car en2)))) "CIRCLE"))
   )
   )
          (princ "\n你选取的不是圆或者未选取任何图元,请重新选取第二个圆!")
   )
   (setq db1 (entget (car en1))
  o1 (cdr (assoc 10 db1))
  r1 (cdr (assoc 40 db1))
  db2 (entget (car en2))
  o2 (cdr (assoc 10 db2))
  r2 (cdr (assoc 40 db2))
   )
   (if (< r1 r2)
       (progn
          (setq oc o1  o1 o2  o2 oc
  oc r1  r1 r2  r2 oc
   )
       )
   )
   (setq dr (- r1 r2)  ang (angle o1 o2)  dd (distance o1 o2)
  b  (- (* 0.5 pi) (atan (/ dr (sqrt (- (* dd dd) (* dr dr))))))
   )
   
   (command "_line" (polar o1 (+ ang b) r1) (polar o2 (+ ang b) r2) ""
            "_line" (polar o1 (- ang b) r1) (polar o2 (- ang b) r2) ""
   )
   (mapcar 'setvar xtblm xtblz)(princ)
)
回复 支持 1 反对 0

使用道具 举报

发表于 2005-11-11 13:49:00 | 显示全部楼层
  1. (command"LINE"(getpoint)"tan"pause "")
发表于 2005-11-11 13:53:00 | 显示全部楼层

圆外的点到圆有两条切线耶!

发表于 2005-11-11 14:16:00 | 显示全部楼层

参考

(defun c:test()
(setq ent (entget(car(entsel))))
(setq pt1 (getpoint "\ninput point:"))
(setq pt2 (trans(cdr(assoc 10 ent)) 0 1))
(setq r (cdr(assoc 40 ent)))
(setq d_ist (sqrt(- (expt(distance pt1 pt2)2) (expt r 2))))
(setq ang_le (atan (/ r d_ist)))
(command "line" pt1 (polar pt1 (+ ang_le (angle pt1 pt2)) d_ist) "")
(command "mirror" (entlast) "" pt1 pt2  "n")
)
 楼主| 发表于 2005-11-12 22:01:00 | 显示全部楼层

我自己编了一个程序,不过太长了.

而且还有不足之处,就是如果两个圆的半径相等的话,这个程序不能做公共的外切线.

还有一个缺点就是,如果两个圆的半径不相等的话,要先选择小圆.

如果要做完美了,还要做一些判断.

由于时间有限,程序以后再做完善吧.

小弟先把这个不完善的程序发给大家,那位高手,帮忙简化和完善一下.

小弟也感激不尽.向各位大侠献丑了.请批评指正,

程序见下帖

 楼主| 发表于 2005-11-12 22:05:00 | 显示全部楼层

;子程序
(defun waiqie()
(command "circle" cen2  banjc "")            ;以cen2为圆心做圆
(setq yuan1 (entlast))
(redraw cir1 4)
(redraw cir2 4)


(setq pt1 (polar cen2 (/ pi 2) banjc))          ;pt1点 半径差圆的上qua点

(setq pt2 (polar cen2 (/ pi 2) banj2))          ;pt2点 大圆的上qua点

(command "line" cen1 "tan" pt1 "")              ;做圆的切线

(setq xian1 (entlast))                           ;设为xian1

(command "offset" banj1 (entlast)  pt2 "")       ;偏移成为最终的切线

(setq xian2 (entlast))                             ;设这条最终的切线为xian2

(command "mirror" xian2 "" cen1 cen2  "")        ;镜像xian2

(command "erase" xian1 "")                         ;删除辅助的xian1

(command "erase" yuan1 "")                          ;删除辅助的yuan1

(setvar "osmode" oldos)

(princ)
)

 


;子程序
(defun neiqie()
(command "circle" cen2  banjh "")            ;以cen2为圆心做圆
(setq yuan1 (entlast))
(redraw cir1 4)
(redraw cir2 4)


(setq pt1 (polar cen2 (/ pi 2) banj2))          ;pt1点 半径差圆的上qua点

(setq pt2 (polar cen2 (/ pi 2) banjh))          ;pt2点 大圆的上qua点

(command "line" cen1 "tan" pt2 "")              ;做圆的切线

(setq xian1 (entlast))                           ;设为xian1

(command "offset" banj1 (entlast)  pt1 "")       ;偏移成为最终的切线

(setq xian2 (entlast))                             ;设这条最终的切线为xian2

(command "mirror" xian2 "" cen1 cen2  "")        ;镜像xian2

(command "erase" xian1 "")                         ;删除辅助的xian1

(command "erase" yuan1 "")                          ;删除辅助的yuan1

(setvar "osmode" oldos)

(princ)
)

 

(defun c:yy()
(setq oldos (getvar "osmode"))
(setvar "cmdecho" 0)
(setvar "osmode" 0)

(initget 7 "1 2")
(setq str (getkword "请输入您想要的相切方式:[外切(1)/<内切(2)]"))

(setq cir1 (car (entsel "\n 请选择第一个较小的圆:")))
(redraw cir1 3)
(setq cen1 (cdr (assoc 10 (entget cir1))))        ;圆心
(setq banj1 (cdr (assoc 40 (entget cir1))))       ;半径


(setq cir2 (car (entsel "\n 请选择第二个较大的圆:")))
(redraw cir2 3)
(setq cen2 (cdr (assoc 10 (entget cir2))))         ;圆心
(setq banj2 (cdr (assoc 40 (entget cir2))))        ;半径

 

(setq banjc (- banj2 banj1))             ;半径差
(setq banjh (+ banj2 banj1))             ;半径和

(cond
((= str "") (waiqie))
((= str "1") (waiqie))
((= str "2") (neiqie))
(t (print))
)
(princ)
)

发表于 2005-11-14 13:33:00 | 显示全部楼层
phoenixdjq发表于2005-11-11 12:57:00回复:(phoenixdjq)两圆的共切线 我想编一个绘制两个圆共切线的程序。 这个程序我编了一半了,有一个问题不知道怎么解决,就是以知一个点,和一个最后生成的圆,我想从这

楼主倒底是要做两已知圆的公切线还是过一点做一圆的切线??
发表于 2010-10-11 18:48:00 | 显示全部楼层
谢谢楼上的分享,参考下,很感激
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-10-2 12:35 , Processed in 0.204609 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表