找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 670|回复: 2

[讨论]:过两圆作切线

[复制链接]
发表于 2005-5-23 09:31:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
有两个不相交的圆,如何用LISP做一条线与两圆相切。同时考虑切线在圆心连线的左或右
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-6-16 02:00:41 | 显示全部楼层
[php](command "line" "tan" pause "tan" pause "")[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3个

财富等级: 恭喜发财

发表于 2005-6-16 07:28:13 | 显示全部楼层
测试

  1. (defun test (pd / e1 e2)
  2.   (setq
  3.     e1
  4.        (car (entsel))
  5.     e2
  6.        (car (entsel))
  7.   )
  8.   (twocir->qiexian e1 e2 pd)
  9. )


  1. ;;e1为第一个圆,e2为第二个圆
  2. ;;pd=1或2 时做外切线
  3. ;;pd=3或4  时做内切线
  4. ;;1、3是切线在e1的左侧,2、4为右侧

  5. (defun twocir->qiexian
  6.                        (e1        e2        pd        /        oldosmode
  7.                         oldcmdecho        ent1        ent2        cr_pt1        cr_r1
  8.                         cr_pt2        cr_r2        ang        ang1        ang2        jd
  9.                         jd_        jd1        jd2        pt1        pt2        e3
  10.                         e4        left        right        bl_gd        rev
  11.                        )
  12.   (setq oldcmdecho (getvar "cmdecho"))
  13.   (setvar "cmdecho" 0)
  14.   (setq oldosmode (getvar "osmode"))
  15.   (setvar "osmode" 0)

  16.   (setq        ent1   (entget e1)
  17.         ent2   (entget e2)
  18.         cr_pt1 (cdr (assoc 10 ent1))
  19.         cr_r1  (cdr (assoc 40 ent1))
  20.         cr_pt2 (cdr (assoc 10 ent2))
  21.         cr_r2  (cdr (assoc 40 ent2))
  22.   )
  23.   (if (> cr_r1 cr_r2)
  24.     ;;使大圆为pt2
  25.     (setq bl_gd         cr_pt1
  26.           cr_pt1 cr_pt2
  27.           cr_pt2 bl_gd
  28.           bl_gd         cr_r1
  29.           cr_r1         cr_r2
  30.           cr_r2         bl_gd
  31.           bl_gd         e1
  32.           e1         e2
  33.           e2         bl_gd
  34.           rev         t
  35.     )
  36.   )
  37.    
  38.   (setq ang (angle cr_pt1 cr_pt2))
  39.   (if (> ang pi)
  40.     (setq ang (- ang (* pi 2.0)))
  41.   )
  42.   (cond        ((equal cr_pt1 cr_pt2)                ;当两圆同心时
  43.          (prompt "\n两圆同心没有切线")
  44.         )
  45.         ((or (= pd 2) (= pd 1))                ;做外切线
  46.          (if (= cr_r1 cr_r2)
  47.            (progn                        ;当两圆半径相等时
  48.              (command "._pline" cr_pt1 cr_pt2 "")
  49.              (setq e3 (entlast))
  50.              (setq ang (angle cr_pt1 cr_pt2))
  51.              (cond ((= pd 1)
  52.                     (setq ang1 (+ ang (/ pi 2.0)))
  53.                    )
  54.                    ((= pd 2)
  55.                     (if        rev
  56.                       (setq ang1 (+ ang (/ pi 2.0)))
  57.                       (setq ang1 (- ang (/ pi 2.0)))
  58.                     )
  59.                    )
  60.              )
  61.              (setq jd (polar cr_pt1 ang1 cr_r1))
  62.              (command "._move" e3 "" cr_pt1 jd)
  63.            )                                ;end 当两圆半径相等时
  64.            (progn                        ;两圆半径不等时
  65.              (command "._circle" cr_pt2 (abs (- cr_r1 cr_r2)))
  66.              (setq e3 (entlast))
  67.              (command "._circle" "2p" cr_pt1 cr_pt2)
  68.              (setq e4 (entlast))
  69.              (setq jd_ (GetInterPointlist e3 e4))
  70.              (entdel e3)
  71.              (entdel e4)
  72.              (setq ang1 (angle cr_pt1 (nth 0 jd_)))
  73.              (if (> ang1 pi)
  74.                (setq ang1 (- pi (* pi 2.0)))
  75.              )
  76.              (if (> ang1 ang)                ;判断两圆交点的左右
  77.                (setq left 0
  78.                      right 1
  79.                )
  80.                (setq left 1
  81.                      right 0
  82.                )
  83.              )
  84.              (cond ((= pd 2)
  85.                     (if        rev
  86.                       (setq jd1 (nth left jd_))
  87.                       (setq jd1 (nth right jd_))
  88.                     )
  89.                    )
  90.                    ((= pd 1)
  91.                     (if        rev
  92.                       (setq jd1 (nth right jd_))
  93.                       (setq jd1 (nth left jd_))
  94.                     )
  95.                    )
  96.              )
  97.              (command "pline" cr_pt1 jd1 "")
  98.              (setq
  99.                e3
  100.                    (entlast)
  101.                jd2
  102.                    (polar cr_pt2 (angle cr_pt2 jd1) cr_r2)
  103.              )
  104.              (command "._move" e3 "" jd1 jd2)
  105.            )                                ;end 当两圆半径不相等时
  106.          )                                ;end if
  107.         )                                ;end 做外切线
  108.         ((not (setq jd (GetInterPointlist e1 e2)))
  109.                                         ;当两圆没有交点时做内切圆
  110.          (command "._circle" cr_pt2 (+ cr_r1 cr_r2))
  111.          (setq e3 (entlast))
  112.          (command "._circle" "2p" cr_pt1 cr_pt2)
  113.          (setq e4 (entlast))
  114.          (setq jd_ (GetInterPointlist e3 e4))
  115.          (entdel e3)
  116.          (entdel e4)
  117.          (setq ang1 (angle cr_pt1 (nth 0 jd_)))
  118.          (if (> ang1 pi)
  119.            (setq ang1 (- pi (* pi 2.0)))
  120.          )
  121.          (if (> ang1 ang)                ;判断两圆交点的左右
  122.            (setq left 0
  123.                  right 1
  124.            )
  125.            (setq left 1
  126.                  right 0
  127.            )
  128.          )
  129.          (cond ((= pd 4)
  130.                 (if (and (= cr_r1 cr_r2)
  131.                          (and (> ang (* pi -1.0)) (< ang (* pi -0.5)))
  132.                     )
  133.                   (setq jd1 (nth right jd_))
  134.                   (setq jd1 (nth left jd_))
  135.                 )
  136.                )
  137.                ((= pd 3)
  138.                 (if (and (= cr_r1 cr_r2)
  139.                          (and (> ang (* pi -1.0)) (< ang (* pi -0.5)))
  140.                     )
  141.                   (setq jd1 (nth left jd_))
  142.                   (setq jd1 (nth right jd_))
  143.                 )
  144.                )
  145.          )
  146.          (command "pline" cr_pt1 jd1 "")
  147.          (setq
  148.            e3
  149.                (entlast)
  150.            jd2
  151.                (polar cr_pt2 (angle cr_pt2 jd1) cr_r2)
  152.          )
  153.          (command "._move" e3 "" jd1 jd2)
  154.         )                                ;end 当两圆没有交点时
  155.         (t                                ;当两圆有交点时做内切圆
  156.          (if (= 1 (length jd))
  157.            (progn                        ;有一个交点时
  158.              (setq jd (nth 0 jd))
  159.              (setq pt1 (polar jd (+ ang (/ pi 2.0)) cr_r1))
  160.              (setq pt2 (polar jd (- ang (/ pi 2.0)) cr_r1))
  161.              (command "pline" pt1 pt2 "")
  162.            )                                ;end 一个交点时
  163.            (prompt "\n两圆相交没有内切线")
  164.          )
  165.         )                                ;end  当两圆有交点时
  166.            
  167.   )

  168.   (setvar "cmdecho" oldcmdecho)
  169.   (setvar "osmode" oldosmode)
  170.   (princ)

  171. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-28 07:04 , Processed in 0.290373 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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