找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 898|回复: 12

[求助]:一个头疼的问题(作图算法)

[复制链接]
发表于 2005-7-16 12:04:43 | 显示全部楼层 |阅读模式

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

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

×
百思不解的一个问题,请帮助解答:
在一个平面内,已知A-A',B-B'两条任意直线,要求作一条曲线把两者连接起来(图示红线),这条曲线由两段相切圆弧组成,弧半径要相同,要与两条直线相切在端点A、B上。
CAD作图的时候总希望能够精确,遇到这类问题没办法,会觉得很不爽:),请帮帮忙吧,先谢谢了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-7-16 12:57:53 | 显示全部楼层
这样。
做法:画两个任意半径的等圆,满足与两直线相切,再移动、比例缩放,方法与本论坛另一题相同:在一个U形中画两等大相切圆。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-16 15:46:54 | 显示全部楼层
tqr:
能否详细说明或给出链接?
怎样保证切点在直线原来的端点上?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2005-7-16 19:36:00 | 显示全部楼层
谢谢,试过了,结果弧线和直线不相交,问题在哪?
有趣的是算法,斑竹能否分享一下解决问题的思路?

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

使用道具 举报

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

使用道具 举报

发表于 2005-7-16 23:07:28 | 显示全部楼层
最初由 841594 发布
[B]谢谢,试过了,结果弧线和直线不相交,问题在哪?
有趣的是算法,斑竹能否分享一下解决问题的思路?
tqr:你说的对,我懂了!向你学习!! [/B]

发个实例,给你测试!
“源码”如下,未经精简:
  1. [FONT=courier new];|
  2. for 841594|;
  3. (load "xyp_lib")
  4. ;|加载通用函数(可在签名栏直接下载)
  5. 如果已经下载xyp_lib并放到搜索路径下可以不再下载!
  6. 利用以下任何一种方式即可加载和运行通用函数内的所有子程序:
  7. 1.在acad.lsp中增加(load"xyp_lib")
  8. 2.在每个程序内增加(load"xyp_lib")
  9. 3.在command下,输入(load"xyp_lib")
  10. 4.在菜单.mnl中增加(load"xyp_lib")
  11. 5.将xyp_lib.vlx文件直接拽到cad屏幕
  12. [COLOR=red] ★通用函数下载地址:[/COLOR][url]http://www.xdcad.net/forum/attachment.php?s=&postid=1606661[/url]|;

  13. (defun c:2a ()
  14.   (CMDLA0)
  15.   (setvar "osmode" 39)
  16.   (setq        s1    (car (USEL1 0 "LINE" "LINE线1"))
  17.         s2    (car (USEL1 0 "LINE" "LINE线2"))
  18.         pt1   (getpoint "\n线1端点 : ")
  19.         pt2   (getpoint pt1 "\n线2端点 : ")
  20.         ang-l (angle pt1 pt2)
  21.         a1    (vla-get-angle (obj s1))
  22.         b1    (vla-get-angle (obj s2))
  23.   )
  24.   (setvar "osmode" 0)
  25.   (while (> ang-l pi)
  26.     (setq ang-l (- ang-l pi))
  27.   )
  28.   (while (> a1 pi)
  29.     (setq a1 (- a1 pi))
  30.   )
  31.   (while (> b1 pi)
  32.     (setq b1 (- b1 pi))
  33.   )
  34.   (setq        a (- ang-l a1 (* pi 0.5))
  35.         b (- ang-l b1 (* pi 0.5))
  36.   )
  37.   (while (< a 0)
  38.     (setq a (+ a pi))
  39.   )
  40.   (while (> a (* PI 0.5))
  41.     (setq a (- pi a))
  42.   )
  43.   (while (< b 0)
  44.     (setq b (+ b pi))
  45.   )
  46.   (while (> b (* PI 0.5))
  47.     (setq b (- pi b))
  48.   )
  49.   (setq        m (+ (cos a) (cos b))
  50.         n (- (sin a) (sin b))
  51.         l (distance pt1 pt2)
  52.         a (- 4.0 (* m m) (* n n))
  53.         b (* 2.0 m l)
  54.         c (* -1.0 l l)
  55.   )
  56.   (setq        r1 (X_GENG1 a b c)
  57.         r2 (X_GENG2 a b c)
  58.   )
  59.   (SETQ pt3  (polar pt1 (+ a1 (* pi 0.5))r1)
  60.         pt4  (polar pt2 (- b1 (* pi 0.5))r1)
  61.         pt5(_midp pt3 pt4)
  62.         )
  63.   (mkla"弧"1)
  64.   (command "arc" "c" pt3 pt5 pt1)
  65.   (command "arc" "c" pt4 pt5 pt2)
  66.   (CMDLA1)
  67. )
  68. (pxyp"2a")
  69. (princ)[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-7-17 01:45:17 | 显示全部楼层
翻出一个箱底的,是当年用来求一组折线的最大倒圆半径,看看就知到当时的粗糙,不改放上来了。


  1. (defun c:fr1(/ db p1 p2 in n p3 p4 r r0 r1)
  2.   (mapcar 'setvar '("cmdecho""blipmode""osmode") '(0 0 1))
  3.   (setq db '() in 1 p1 (getpoint "\n 输入第一端点:")
  4.         db(cons p1 db))
  5.   (while (setq p2 (getpoint p1 "\n 输入下一端点:"))
  6.     (grdraw p1 p2 1)
  7.     (setq db(cons p2 db) in (1+ in) p1 p2)
  8.   )
  9.   (if (> in 3)(progn
  10.     (setq n(length db) in 0)
  11.     (repeat (- n 3)
  12.       (setq p1(nth in db)                p2(nth (+ 1 in) db)
  13.             p3(nth (+ 2 in) db)                p4(nth (+ 3 in) db)
  14.             r(#r p1 p2 p3 p4)             r0(if (= in 0) r r1)
  15.             r1(min r0 r)                in(1+ in))
  16.     )
  17.   ) )
  18.   (mapcar 'setvar '("cmdecho""blipmode""osmode") '(1 1 32))
  19.   (princ (strcat "\n最小倒圆半径为" (rtos r1 2 2)))(princ)
  20. )

  21. (defun #ctg(#a) (/ (cos #a)(sin #a)))
  22. (defun #ang(#a) (if (< #a pi) #a (- (* 2 pi) #a)) )
  23. (defun #r(#p1 #p2 #p3 #p4 / a123 a234 d12 d23 d34 ctg1 ctg2)
  24.   (setq a123(abs(- (angle #p2 #p3) (angle #p2 #p1)))
  25.         a123(/ (#ang a123) 2)
  26.         a234(abs(- (angle #p3 #p4) (angle #p3 #p2)))
  27.         a234(/ (#ang a234) 2)
  28.         d12(distance #p1 #p2)        d23(distance #p2 #p3)
  29.         d34(distance #p3 #p4)
  30.         ctg1(#ctg a123)                ctg2(#ctg a234)
  31.         r(min (/ d23 (+ ctg1 ctg2)) (/ d12 ctg1) (/ d34 ctg2)))
  32. )

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

使用道具 举报

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

使用道具 举报

发表于 2005-7-21 11:52:08 | 显示全部楼层
最初由 ymihwxf 发布
[B]这是小弟的,不知道是不是这样求解! [/B]

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

使用道具 举报

发表于 2005-7-21 19:12:40 | 显示全部楼层
效果见5楼:
  1. [FONT=courier new](defun c:2a ()
  2.   (CMDLA0)
  3.   (setvar "osmode" 39)
  4.   (setq        e1 (USEL1 0 "LINE" "LINE线1")
  5.         s1 (car e1)
  6.   )
  7.   (grdraw (dxf 10 (entget s1)) (dxf 11 (entget s1)) 1)
  8.   (setq        e2 (USEL1 0 "LINE" "LINE线2")
  9.         s2 (car e2)
  10.   )
  11.   (grdraw (dxf 10 (entget s2)) (dxf 11 (entget s2)) 1)
  12.   (setq        pt1   (osnap (cadr e1) "end")
  13.         pt2   (osnap (cadr e2) "end")
  14.         ang-l (angle pt1 pt2)
  15.         a1    (vla-get-angle (obj s1))
  16.         b1    (vla-get-angle (obj s2))
  17.   )
  18.   (setvar "osmode" 0)
  19.   (while (> ang-l pi)
  20.     (setq ang-l (- ang-l pi))
  21.   )
  22.   (while (> a1 pi)
  23.     (setq a1 (- a1 pi))
  24.   )
  25.   (while (> b1 pi)
  26.     (setq b1 (- b1 pi))
  27.   )
  28.   (setq        a (- ang-l a1 (* pi 0.5))
  29.         b (- ang-l b1 (* pi 0.5))
  30.   )
  31.   (while (< a 0)
  32.     (setq a (+ a pi))
  33.   )
  34.   (while (> a (* PI 0.5))
  35.     (setq a (- pi a))
  36.   )
  37.   (while (< b 0)
  38.     (setq b (+ b pi))
  39.   )
  40.   (while (> b (* PI 0.5))
  41.     (setq b (- pi b))
  42.   )
  43.   (setq        m (+ (cos a) (cos b))
  44.         n (- (sin a) (sin b))
  45.         l (distance pt1 pt2)
  46.         a (- 4.0 (* m m) (* n n))
  47.         b (* 2.0 m l)
  48.         c (* -1.0 l l)
  49.         pt3 (polar pt1 (+ a1 (* pi 0.5)) (X_GENG1 a b c))
  50.         pt4 (polar pt2 (- b1 (* pi 0.5)) (X_GENG1 a b c))
  51.         pt5 (_midp pt3 pt4)
  52.   )
  53.   (mkla "弧" 1)
  54.   (command "arc" "c" pt3 pt5 pt1)
  55.   (command "arc" "c" pt4 pt5 pt2)
  56.   (redraw)
  57.   (CMDLA1)
  58. )
  59. (pxyp "2a")
  60. (princ)[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-21 11:55 , Processed in 0.379359 second(s), 61 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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