找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: xiao_longxin

[讨论]:如何求不规则封闭pline线内最大圆

[复制链接]

已领礼包: 3个

财富等级: 恭喜发财

 楼主| 发表于 2005-5-29 16:29:00 | 显示全部楼层
好像应该这么论述:求与三条直线(三条直线在同一平面,也有可能三条线相互平行)相切的所有圆。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-29 17:42:23 | 显示全部楼层
最初由 xiao_longxin 发布
[B]好像应该这么论述:求与三条直线(三条直线在同一平面,也有可能三条线相互平行)相切的所有圆。 [/B]

“三条线相互平行”,那是斑马线!呵呵……
还是试试偶的“内切圆”程序吧。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-30 07:18:22 | 显示全部楼层
狂刀您好!您的程序怎么不好用啊?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3个

财富等级: 恭喜发财

 楼主| 发表于 2005-5-30 12:10:54 | 显示全部楼层
关于与三条线相切的所有圆的程序已经解决了,整理好晚上传上来大家测试
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-30 12:55:21 | 显示全部楼层
[php]
最简单的程序:
(setvar "osmode" 256)
(command "circle" "3p" pause pause pause)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3个

财富等级: 恭喜发财

 楼主| 发表于 2005-5-30 13:35:25 | 显示全部楼层
关于两点一线、两线一点做切圆是有几何解法,用几何解法可以不用人为干涉
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-30 21:33:36 | 显示全部楼层
看来楼主离你要求的最大圆的目的不远了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3个

财富等级: 恭喜发财

 楼主| 发表于 2005-5-30 22:01:52 | 显示全部楼层
我把我刚写完的求与三条直线相切的所有圆的函数帖出来大家一起测试




  1. ;;By Xiao_longxin
  2. ;;e1_star  e1_end 第一条直线起、点
  3. ;;e2_star  e2_end 第二条直线起、点
  4. ;;e3_star  e3_end 第三条直线起、终点

  5. ;;返回:
  6. ;;(t or nil ((圆心坐标) 半径) ((圆心坐标) 半径).........)
  7. ;;当返回值第一元素为t时,表示有内切圆(即第一个)
  8. ;;当返回值第一元素为nil时,时表示无内圆
  9. ;;当返回值为nil时,表示三线平行,没有切圆

  10. (defun qieyuan (e1_star         e1_end          e2_star  e2_end   e3_star  e3_end
  11.                 /         ent          e1_star  e1_end   e2_star  e2_end
  12.                 e3_star         e3_end          ang1           ang2            ang3     j1_2
  13.                 j1_3         j2_3          e1_e2           e1_e3    e2_e3    cr_pt
  14.                 jd1         jd2          jd3           j1_3_    j2_3_    cr_r
  15.                 cr_list
  16.                )
  17.   ;;(setq e1_star (getpoint))
  18.   ;;(setq e1_end (getpoint))
  19.   ;;(setq e2_star (getpoint))
  20.   ;;(setq e2_end (getpoint))
  21.   ;;(setq e3_star (getpoint))
  22.   ;;(setq e3_end (getpoint))
  23.   ;;(command ".-color" 7)
  24.   ;;(command "point" e1_star)
  25.   ;;(command "point" e1_end)
  26.   ;;(command "point" e2_star)
  27.   ;;(command "point" e2_end)
  28.   ;;(command "point" e3_star)
  29.   ;;(command "point" e3_end)
  30.                                         ;求得三条线的交点
  31.   (setq j1_2 (inters e1_star e1_end e2_star e2_end nil))
  32.   (setq j1_3 (inters e1_star e1_end e3_star e3_end nil))
  33.   (setq j2_3 (inters e2_star e2_end e3_star e3_end nil))
  34.   ;;(command ".-color" 1)
  35.   ;;(command "pline" j1_2 j1_3 "")
  36.   ;;(command "pline" j1_2 j2_3 "")
  37.   ;;(command "pline" j2_3 j1_3 "")
  38.                                         ;得到三条直线的方位角
  39.   (setq ang1 (angle e1_star e1_end))
  40.   (setq ang2 (angle e2_star e2_end))
  41.   (setq ang3 (angle e3_star e3_end))
  42.                                         ;分别判断三条直线之间是否平行
  43.   (if (or (< (abs (- ang1 ang2)) 0.000005)
  44.           (and (< (abs (- ang1 ang2)) (+ pi 0.000005))
  45.                (> (abs (- ang1 ang2)) (- pi 0.000005))
  46.           )
  47.       )
  48.     (setq e1_e2 t)
  49.   )
  50.   (if (or (< (abs (- ang1 ang3)) 0.000005)
  51.           (and (< (abs (- ang1 ang3)) (+ pi 0.000005))
  52.                (> (abs (- ang1 ang3)) (- pi 0.000005))
  53.           )
  54.       )
  55.     (setq e1_e3 t)
  56.   )
  57.   (if (or (< (abs (- ang3 ang2)) 0.000005)
  58.           (and (< (abs (- ang3 ang2)) (+ pi 0.000005))
  59.                (> (abs (- ang3 ang2)) (- pi 0.000005))
  60.           )
  61.       )
  62.     (setq e2_e3 t)
  63.   )

  64.   (if (and e1_e2 e2_e3 e1_e3)
  65.     (progn ;;如果三条直线平行则跳中止程序
  66.            (prompt "三线平行,没有切圆!")
  67.            (setq cr_list nil)
  68.     )
  69.     (progn
  70.       (if (and (not e1_e2) (not e1_e3) (not e2_e3))
  71.                                         ;如果三条直线都不平行则
  72.         (progn
  73.           (setq cr_list '(t))
  74.           ;;求内切圆
  75.           (setq
  76.             jd1        (rem (/ (+ ang1 (* 2 pi) ang3 (* 2 pi)) 2) (* 2 pi))
  77.           )
  78.           (setq j1_3_ (polar j1_3 jd1 100))
  79.           ;;(command "pline" j1_3 j1_3_ "")
  80.           (setq
  81.             jd2        (rem (/ (+ ang2 (* 2 pi) ang3 (* 2 pi)) 2) (* 2 pi))
  82.           )
  83.           (setq j2_3_ (polar j2_3 jd2 100))
  84.           ;;(command "pline" j2_3 j2_3_ "")
  85.           (setq cr_pt (inters j1_3 j1_3_ j2_3 j2_3_ nil))
  86.           (setq jd3 (polar cr_pt (+ ang1 (/ pi 2)) 100))
  87.           (setq cr_r (inters j1_3 j1_2 jd3 cr_pt nil))
  88.           ;;(command "._circle" cr_pt cr_r)
  89.           (setq
  90.             cr_list (append cr_list
  91.                             (list (list cr_pt (distance cr_pt cr_r)))
  92.                     )
  93.           )
  94.           ;;求出其它的切圆
  95.                      
  96.           ;;第一个
  97.           (setq
  98.             jd1
  99.              (rem (/ (+ ang1 (* 2 pi) ang3 (* 3 pi)) 2) (* 2 pi))
  100.           )
  101.           (setq j1_3_ (polar j1_3 jd1 100))
  102.           (setq
  103.             jd2
  104.              (rem (/ (+ ang2 (* 3 pi) ang1 (* 3 pi)) 2) (* 2 pi))
  105.           )
  106.           (setq j2_3_ (polar j1_2 jd2 100))
  107.           (setq cr_pt (inters j1_3 j1_3_ j1_2 j2_3_ nil))
  108.           (setq jd3 (polar cr_pt (+ ang1 (/ pi 2)) 100))
  109.           (setq cr_r (inters j1_3 j1_2 jd3 cr_pt nil))
  110.           ;;(command "._circle" cr_pt cr_r)
  111.           (setq        cr_list
  112.                  (append cr_list
  113.                          (list (list cr_pt (distance cr_pt cr_r)))
  114.                  )
  115.           )
  116.           ;;第二个
  117.           (setq
  118.             jd1
  119.              (rem (/ (+ ang1 (* 3 pi) ang3 (* 2 pi)) 2) (* 2 pi))
  120.           )
  121.           (setq j1_3_ (polar j1_3 jd1 100))
  122.           (setq
  123.             jd2
  124.              (rem (/ (+ ang2 (* 2 pi) ang3 (* 3 pi)) 2) (* 2 pi))
  125.           )
  126.           (setq j2_3_ (polar j2_3 jd2 100))
  127.           (setq cr_pt (inters j1_3 j1_3_ j2_3 j2_3_ nil))
  128.           (setq jd3 (polar cr_pt (+ ang3 (/ pi 2)) 100))
  129.           (setq cr_r (inters j1_3 j2_3 jd3 cr_pt nil))
  130.           ;;(command "._circle" cr_pt cr_r)
  131.           (setq        cr_list
  132.                  (append cr_list
  133.                          (list (list cr_pt (distance cr_pt cr_r)))
  134.                  )
  135.           )
  136.           ;;第三个
  137.           (setq
  138.             jd1
  139.              (rem (/ (+ ang1 (* 2 pi) ang2 (* 2 pi)) 2) (* 2 pi))
  140.           )
  141.           (setq j1_3_ (polar j1_2 jd1 100))
  142.           (setq
  143.             jd2
  144.              (rem (/ (+ ang2 (* 3 pi) ang3 (* 2 pi)) 2) (* 2 pi))
  145.           )
  146.           (setq j2_3_ (polar j2_3 jd2 100))
  147.           (setq cr_pt (inters j1_2 j1_3_ j2_3 j2_3_ nil))
  148.           (setq jd3 (polar cr_pt (+ ang2 (/ pi 2)) 100))
  149.           (setq cr_r (inters j2_3 j1_2 jd3 cr_pt nil))
  150.           ;;(command "._circle" cr_pt cr_r)
  151.           (setq        cr_list
  152.                  (append cr_list
  153.                          (list (list cr_pt (distance cr_pt cr_r)))
  154.                  )
  155.           )
  156.           ;;end 其它切圆
  157.         )
  158.                                         ;end 三条行都不平行

  159.         (progn                                ;有两条线平行
  160.           (setq cr_list '(nil))
  161.           (cond        (e1_e2
  162.                  (if (< (abs (- ang1 ang2)) 0.000005)
  163.                    (setq ang1 (+ ang1 pi))
  164.                  )
  165.                  (setq
  166.                    jd1
  167.                     (rem (/ (+ ang1 (* 2 pi) ang3 (* 2 pi)) 2) (* 2 pi))
  168.                  )
  169.                  (setq j1_3_ (polar j1_3 jd1 100))
  170.                  (setq
  171.                    jd2
  172.                     (rem (/ (+ ang2 (* 2 pi) ang3 (* 2 pi)) 2) (* 2 pi))
  173.                  )
  174.                  (setq j2_3_ (polar j2_3 jd2 100))
  175.                  (setq cr_pt (inters j1_3 j1_3_ j2_3 j2_3_ nil))
  176.                  (setq jd3 (polar cr_pt (+ ang3 (/ pi 2)) 100))
  177.                  (setq cr_r (inters j1_3 j2_3 jd3 cr_pt nil))
  178.                  ;;(command "._circle" cr_pt cr_r)
  179.                  (setq cr_list
  180.                         (append        cr_list
  181.                                 (list (list cr_pt (distance cr_pt cr_r)))
  182.                         )
  183.                  )
  184.                                         ;求得与之相补的切圆
  185.                  (setq
  186.                    jd1
  187.                     (rem (/ (+ ang1 (* 3 pi) ang3 (* 2 pi)) 2) (* 2 pi))
  188.                  )
  189.                  (setq j1_3_ (polar j1_3 jd1 100))
  190.                  (setq
  191.                    jd2
  192.                     (rem (/ (+ ang2 (* 2 pi) ang3 (* 3 pi)) 2) (* 2 pi))
  193.                  )
  194.                  (setq j2_3_ (polar j2_3 jd2 100))
  195.                  (setq cr_pt (inters j1_3 j1_3_ j2_3 j2_3_ nil))
  196.                  (setq jd3 (polar cr_pt (+ ang3 (/ pi 2)) 100))
  197.                  (setq cr_r (inters j1_3 j2_3 jd3 cr_pt nil))
  198.                  ;;(command "._circle" cr_pt cr_r)
  199.                  (setq cr_list
  200.                         (append        cr_list
  201.                                 (list (list cr_pt (distance cr_pt cr_r)))
  202.                         )
  203.                  )
  204.                 )                        ;end e1_e2
  205.                 (e1_e3
  206.                  (if (< (abs (- ang1 ang3)) 0.000005)
  207.                    (setq ang1 (+ ang1 pi))
  208.                  )
  209.                  (setq
  210.                    jd1
  211.                     (rem (/ (+ ang1 (* 2 pi) ang2 (* 2 pi)) 2) (* 2 pi))
  212.                  )
  213.                  (setq j1_3_ (polar j1_2 jd1 100))
  214.                  (setq
  215.                    jd2
  216.                     (rem (/ (+ ang2 (* 2 pi) ang3 (* 2 pi)) 2) (* 2 pi))
  217.                  )
  218.                  (setq j2_3_ (polar j2_3 jd2 100))
  219.                  (setq cr_pt (inters j1_2 j1_3_ j2_3 j2_3_ nil))
  220.                  (setq jd3 (polar cr_pt (+ ang2 (/ pi 2)) 100))
  221.                  (setq cr_r (inters j1_2 j2_3 jd3 cr_pt nil))
  222.                  ;;(command "._circle" cr_pt cr_r)
  223.                  (setq cr_list
  224.                         (append        cr_list
  225.                                 (list (list cr_pt (distance cr_pt cr_r)))
  226.                         )
  227.                  )
  228.                                         ;求得互补切圆
  229.                  (setq
  230.                    jd1
  231.                     (rem (/ (+ ang1 (* 3 pi) ang2 (* 2 pi)) 2) (* 2 pi))
  232.                  )
  233.                  (setq j1_3_ (polar j1_2 jd1 100))
  234.                  (setq
  235.                    jd2
  236.                     (rem (/ (+ ang2 (* 3 pi) ang3 (* 2 pi)) 2) (* 2 pi))
  237.                  )
  238.                  (setq j2_3_ (polar j2_3 jd2 100))
  239.                  (setq cr_pt (inters j1_2 j1_3_ j2_3 j2_3_ nil))
  240.                  (setq jd3 (polar cr_pt (+ ang2 (/ pi 2)) 100))
  241.                  (setq cr_r (inters j1_2 j2_3 jd3 cr_pt nil))
  242.                  ;;(command "._circle" cr_pt cr_r)
  243.                  (setq cr_list
  244.                         (append        cr_list
  245.                                 (list (list cr_pt (distance cr_pt cr_r)))
  246.                         )
  247.                  )
  248.                 )                        ;end e1_e3
  249.                 (e2_e3
  250.                  (if (< (abs (- ang2 ang3)) 0.000005)
  251.                    (setq ang2 (+ ang2 pi))
  252.                  )
  253.                  (setq
  254.                    jd1
  255.                     (rem (/ (+ ang1 (* 3 pi) ang2 (* 2 pi)) 2) (* 2 pi))
  256.                  )
  257.                  (setq j1_3_ (polar j1_2 jd1 100))
  258.                  (setq
  259.                    jd2
  260.                     (rem (/ (+ ang1 (* 3 pi) ang3 (* 2 pi)) 2) (* 2 pi))
  261.                  )
  262.                  (setq j2_3_ (polar j1_3 jd2 100))
  263.                  (setq cr_pt (inters j1_2 j1_3_ j1_3 j2_3_ nil))
  264.                  (setq jd3 (polar cr_pt (+ ang1 (/ pi 2)) 100))
  265.                  (setq cr_r (inters j1_2 j1_3 jd3 cr_pt nil))
  266.                  ;;(command "._circle" cr_pt cr_r)
  267.                  (setq cr_list
  268.                         (append        cr_list
  269.                                 (list (list cr_pt (distance cr_pt cr_r)))
  270.                         )
  271.                  )
  272.                                         ;求得互补切圆
  273.                  (if (< (abs (- ang2 ang3)) 0.000005)
  274.                    (setq ang2 (+ ang2 pi))
  275.                  )
  276.                  (setq
  277.                    jd1
  278.                     (rem (/ (+ ang1 (* 2 pi) ang2 (* 2 pi)) 2) (* 2 pi))
  279.                  )
  280.                  (setq j1_3_ (polar j1_2 jd1 100))
  281.                  (setq
  282.                    jd2
  283.                     (rem (/ (+ ang1 (* 2 pi) ang3 (* 2 pi)) 2) (* 2 pi))
  284.                  )
  285.                  (setq j2_3_ (polar j1_3 jd2 100))
  286.                  (setq cr_pt (inters j1_2 j1_3_ j1_3 j2_3_ nil))
  287.                  (setq jd3 (polar cr_pt (+ ang1 (/ pi 2)) 100))
  288.                  (setq cr_r (inters j1_2 j1_3 jd3 cr_pt nil))
  289.                  ;;(command "._circle" cr_pt cr_r)
  290.                  (setq cr_list
  291.                         (append        cr_list
  292.                                 (list (list cr_pt (distance cr_pt cr_r)))
  293.                         )
  294.                  )
  295.                 )
  296.           )
  297.         )                                ;end 有两条线平行
  298.       )
  299.     )
  300.   )
  301. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-5-30 23:09:07 | 显示全部楼层
程序太长,没时间看
能否简要列出求解的方法,算法?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3个

财富等级: 恭喜发财

 楼主| 发表于 2005-5-30 23:46:04 | 显示全部楼层
1。通过三条直线取得三个交点:j1_2,j1_3,j2_3,并取得三条直线的方位角:ang1,ang2,ang3
2.通过ang1、ang2、ang3判断三条线之间的平行关系
3。如果三线平行中止程序
4。如果三线互不平行:
  先求内切圆
  再求余下的三个切圆
5。如果有两线平行则不求内切圆,再根据前面取得三线平行关系得知哪两线平行,求出其一个切圆后,再求其互补的切圆
6。程序结束

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

使用道具 举报

发表于 2005-5-31 16:42:05 | 显示全部楼层

  1. ;;;nqy = 求与三直线相切圆----by 陌生人.2005.5
  2. ;; 返回:平行返回nil,二条平行返回两个圆及圆心表,不平行返回4个圆及圆心表。
  3. (defun c:nqy (/ a b c a1 a2 b1 b2 c1 c2 lst alst iplst ialst ialst2 pl1 pl2 xl1 xl2 lls ints ints2 aa len)
  4.   (command ".undo" "be")
  5.   (setq a (car(entsel))
  6.         b (car(entsel))
  7.         c (car(entsel))
  8.         a1(vlax-curve-getstartpoint a)
  9.         a2(vlax-curve-getendpoint a)
  10.         b1(vlax-curve-getstartpoint b)
  11.         b2(vlax-curve-getendpoint b)
  12.         c1(vlax-curve-getstartpoint c)
  13.         c2(vlax-curve-getendpoint c)
  14.   )
  15.   (setq lst (list (list a1 a2)(list b1 b2)(list c1 c2)))
  16.   (setq alst (mapcar '(lambda(x)(angle (car x)(cadr x)))lst))
  17.   (setq iplst(mapcar '(lambda(x y) (inters (car x)(cadr x)(car y)(cadr y) nil)) (cons (list c1 c2) lst) lst))
  18.   (setq ialst(mapcar '(lambda(x y) (/ (+ x y) 2)) (cons (last alst) alst) alst))
  19.   (setq ialst2(mapcar '(lambda(x) (+ (* 0.5 PI) x)) ialst))
  20.   (setq pl1 (mapcar '(lambda(x y)(if x(polar x y 100))) iplst ialst))
  21.   (setq pl2 (mapcar '(lambda(x y)(if x(polar x y 100))) iplst ialst2))
  22.   (setq xl1 (mapcar '(lambda(x y)(list x y)) iplst pl1))
  23.   (setq xl2 (mapcar '(lambda(x y)(list x y)) iplst pl2))
  24.   (setq lls (append xl1 xl2))
  25.   (setq lls (vl-remove '(nil nil) lls))
  26.   (setq ints (apply 'append(apply 'append
  27.                     (mapcar '(lambda(x)
  28.                                (mapcar '(lambda(y)(setq int (inters (car x)(cadr x)(car y)(cadr y) nil))
  29.                                           (if int (list int) nil)) lls))lls))))
  30.   (setq ints2 ints lst nil)
  31.   (while ints2
  32.     (setq aa (car ints2)
  33.           len (length ints2)
  34.           ints2(vl-remove-if '(lambda(x)(equal aa x 1e-4)) ints2))
  35.     (if (<= 2 (- len (length ints2)))
  36.       (setq lst (cons aa lst))
  37.     )
  38.   )
  39.   (setq ang (angle a1 a2))
  40.   (if
  41.     (setq lst2 (apply 'append
  42.                       (mapcar '(lambda(x)
  43.                                  (if (apply 'or(mapcar '(lambda(y)(equal x y 1e-4))iplst)) nil(list x)))
  44.                               lst)))
  45.     (mapcar '(lambda(x)
  46.                (setq r (distance x (inters a1 a2 x (polar x (+ ang (* 0.5 PI)) 100) nil)))
  47.              (command ".circle" x (distance x (vlax-curve-getclosestpointto a x T)))) lst2)
  48.   )
  49.   (command ".undo" "e")
  50.   lst2
  51. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3个

财富等级: 恭喜发财

 楼主| 发表于 2005-6-1 00:50:36 | 显示全部楼层
再帖一个关于切圆的程序(纯几何方法解决):
 求:过两点与一直线相切的圆

[CODE]
;;By Xiao_longxin
;;po_star 直线起点           po_end 直线终点
;;p1、p2 所要求的圆上两点


(defun errexit (s)
  (command "._undo" "_E")
  (princ "\nError:  ")
  (princ s)
)

(defun twopo_line_qieyuan (po_star    po_end         p1            p2
                           /              cr_list         jd1 jd2   ang_zxcz
                           ang1              ang2         ang3            ang4
                           dist1      dist2         p1_zx            p2_zx
                           p1p2              cr_pt         cr_r            ent
                           oldcmdecho oldosmode bl_gd
                          )

  ;;(setq po_star (getpoint))
  ;;(setq po_end (getpoint))
  ;;(setq p1 (getpoint))
  ;;(setq p2 (getpoint))
  ;;(command "point" po_star)
  ;;(command "point" po_end)
  ;;(command "point" p1)
  ;;(command "point" p2)
  ;;(command "pline" po_star po_end "")

  (setq oldcmdecho (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (setq oldosmode (getvar "osmode"))
  (setvar "osmode" 0)

  (setq ang1 (angle po_star po_end))        ;直线的方位角
  (setq ang2 (angle p1 p2))                ;二点的方位角
  (setq ang_zxcz (rem (+ ang1 (/ pi 2)) (* 2 pi))) ;与直线垂直的方位角

  ;;求p1点与直线的垂距,以此判断是否在直线上
  (setq jd1 (polar p1 ang_zxcz 100))
  (setq jd1 (inters po_star po_end p1 jd1 nil))
  (setq dist1 (distance p1 jd1))
  (setq ang3 (angle jd1 p1))
  (if (< dist1 0.001)
    (setq p1_zx t)
  )
  ;;求p2点与直线的垂距,以此判断是否在直线上
  (setq jd2 (polar p2 ang_zxcz 100))
  (setq jd2 (inters po_star po_end p2 jd2 nil))
  (setq dist2 (distance p2 jd2))
  (setq ang4 (angle jd2 p2))
  (if (< dist2 0.001)
    (setq p2_zx t)
  )
                                        ;判断直线是否在两点间
  (if (and (> (abs (- ang3 ang4)) 0.00000001)
           (and (not p2_zx) (not p1_zx))
      )
    (setq p1p2 t)
  )

  (if (or p1p2 (and p2_zx p1_zx))
    (progn                                ;如两点都在线上则中止程序
      (prompt "\n两点在直线上或者点在直线两边,没有切圆")
      (setvar "cmdecho" oldcmdecho)
      (setvar "osmode" oldosmode)
      (setq pr_list nil)
    )
    (progn
      (cond
        ((or (< (abs (- ang1 ang2)) 0.000005)
             (and (< (abs (- ang1 ang2)) (+ pi 0.000005))
                  (> (abs (- ang1 ang2)) (- pi 0.000005))
             )
         )                                ;p1、p2点的连线与直线平行
         (setq dist1 (/ (distance p1 p2) 2))
         (setq jd1 (polar p1 ang2 dist1))
         (setq jd2 (polar jd1 ang_zxcz 100))
         (setq jd1 (inters jd1 jd2 po_star po_end nil))
         (command "._circle" "3p" p1 p2 jd1)
         (setq ent (entget (entlast)))
         (setq cr_pt (cdr (assoc 10 ent)))
         (setq cr_r (cdr (assoc 40 ent)))
         (setvar "cmdecho" oldcmdecho)
         (setvar "osmode" oldosmode)
         (setq cr_list (list cr_pt cr_r))
        )                                ;end   p1、p2点的连线与直线平行
        ((or p2_zx p1_zx)                ;p1、p2点有一点在直线上
         (if p1_zx
           (progn
             (setq jd1 p1)
             (setq jd2 p2)
           )
           (progn
             (setq jd1 p2)
             (setq jd2 p1)
           )
         )
         (setq p1 (polar jd1 ang1 100))
         (if (= 100 (setq dist2 (distance jd2 p1)))
           (progn
             (setq p1 (polar jd1 ang1 200))
             (setq dist2 (distance p1 jd2))
           )
         )
         (setq dist1 (distance p1 jd1))
         (setq dist1 (/ (* dist1 dist1) dist2))
         (setq ang3 (angle p1 jd2))
         (setq p1 (polar p1 ang3 dist1))
         (command "._circle" "3p" jd1 jd2 p1)
         (setq ent (entget (entlast)))
         (setq cr_pt (cdr (assoc 10 ent)))
         (setq cr_r (cdr (assoc 40 ent)))
         (setvar "cmdecho" oldcmdecho)
         (setvar "osmode" oldosmode)
         (setq cr_list (list cr_pt cr_r))
        )                                ;end  p1、p2点有一点在直线上
        (t                                ;一般情况
         (setq jd1 (inters po_star po_end p1 p2 nil))
         (setq dist1 (distance p1 jd1))
         (setq dist2 (distance p2 jd1))
         (setq dist1 (sqrt (* dist1 dist2)))
         (if (or (< (abs (- ang_zxcz ang2)) 0.000000005)
                 (and (< (abs (- ang_zxcz ang2)) (+ pi 0.000000005))
                      (> (abs (- ang_zxcz ang2)) (- pi 0.000000005))
                 )
             )
           (progn
             (setq ang1 (angle jd1 po_star))
             (setq jd2 (polar jd1 ang1 dist1))
             (command "._circle" "3p" jd2 p2 p1)
             (setq ent (entget (entlast)))
             (setq cr_pt (cdr (assoc 10 ent)))
             (setq cr_r (cdr (assoc 40 ent)))
             (setq cr_list (list cr_pt cr_r))
             (setq ang1 (+ ang1 pi))
             (setq jd2 (polar jd1 ang1 dist1))
             (command "._circle" "3p" jd2 p2 p1)
             (setq ent (entget (entlast)))
             (setq cr_pt (cdr (assoc 10 ent)))
             (setq cr_r (cdr (assoc 40 ent)))
             (setvar "cmdecho" oldcmdecho)
             (setvar "osmode" oldosmode)
             (setq cr_list (append cr_list (list cr_pt cr_r)))
           )
           (progn
             (setq ang1 (angle jd1 jd2))
             (setq jd2 (polar jd1 ang1 dist1))
             (command "._circle" "3p" jd2 p2 p1)
             (setq ent (entget (entlast)))
             (setq cr_pt (cdr (assoc 10 ent)))
             (setq cr_r (cdr (assoc 40 ent)))
             (setvar "cmdecho" oldcmdecho)
             (setvar "osmode" oldosmode)
             (setq cr_list (list cr_pt cr_r))
           )
         )                                ;end if
        )                                ;end 一般情况
      )
    )
  )
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 15:24 , Processed in 0.207626 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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