找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1394|回复: 15

[LISP函数]:有没有这样的函数?

[复制链接]
发表于 2003-11-2 11:17:48 | 显示全部楼层 |阅读模式

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

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

×
证明圆弧与直线是否相切?有没有好的函数或者好办法?谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-11-2 12:24:02 | 显示全部楼层
如果线与圆相切那么圆心到切点的线是和切线垂直的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-24 06:45:56 | 显示全部楼层
最初由 snsj 发布
[B]如果线与圆相切那么圆心到切点的线是和切线垂直的 [/B]

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

使用道具 举报

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

使用道具 举报

发表于 2003-12-24 07:57:52 | 显示全部楼层
先求直线与圆的交点。没有交点和有两的交点就不谈了,只有一个交点就肯定相切。

  1. (defun point_line (pt pt1 pt2 / ptangle ptn pt pt1 pt2 dist jptx)
  2.   (setq        ptangle        (angle pt1 pt2)
  3.         ptn        (polar pt (+ (* 0.5 pi) ptangle) 0.01)
  4.         jptx        (inters pt ptn pt1 pt2 nil)
  5.         dist        (distance pt jptx)
  6.   )
  7.   dist
  8. )
  9. (defun c:l_c ()
  10.   (setq c (car (entsel "\n选择圆或圆弧:")))
  11.   (setq l (car (entsel "\n选择直线:")))
  12.   (setq cent (cdr (assoc 10 (entget c))))
  13.   (setq cdist (cdr (assoc 40 (entget c))))
  14.   (setq        lent1 (cdr (assoc 10 (entget l)))
  15.         lent2 (cdr (assoc 11 (entget l)))
  16.   )
  17.   (if (equal (point_line cent lent1 lent2) cdist 1e-10)
  18.     (princ "\n直线与圆相切")
  19.     (princ "\n直线于圆不相切")
  20.   )
  21.   (princ)
  22. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-24 09:43:58 | 显示全部楼层
判断圆弧和直线是否相切(也使用于其他曲线和直线):
(defun c:test (/ pts)
  (vl-load-com)
  (setq a (car (entsel "\nSelect Arc:")))
  (setq b (car (entsel "\nSelect Line:")))
  (setq pts (vla-IntersectWith
               (vlax-ename->vla-object a)
               (vlax-ename->vla-object b)
               acExtendnone))
  (setq m (vlax-safearray-get-u-bound (vlax-variant-value pts) 1))
  (if (or (< m 0)(> m 2))
    nil
    T
  )
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-12-24 23:42:57 | 显示全部楼层
最初由 zhynt 发布
[B]先求直线与圆的交点。没有交点和有两的交点就不谈了,只有一个交点就肯定相切。
[code]
(defun point_line (pt pt1 pt2 / ptangle ptn pt pt1 pt2 dist jptx)
  (setq        ptangle        (angle pt1 pt2)
        ptn        (polar pt (... [/B]


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

使用道具 举报

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

使用道具 举报

发表于 2003-12-25 14:04:14 | 显示全部楼层
如果是求实际切点,满足:
圆弧与直线有实交点
圆心与直线最近点距离=半径
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-12-25 22:11:55 | 显示全部楼层
最初由 lsjjm 发布
[B]更正: 6贴中acExtendnone应为acExtendBoth. [/B]


还是不对的:假定本来就没相交呢,给你延伸了一下才有了交点.
acExtendnone和acExtendBoth都只有一个才是.

上楼的:既然求了交点,判断几个就行了,而不用vl方法,求交点要代数求了.

求出垂线,垂线距离=半径,垂线角度在弧线的起始角和中止角间,这样很方便的.



  1. ;;;弧线和直线相切?
  2. (defun arc-line(a l / an an-e ang an-s is ln p10 p11 pa pb r dxf)
  3. (defun dxf(a b)(cdr(assoc a b)))
  4. (setq an(entget a)ln(entget l)
  5.        p10(dxf 10 ln)p11(dxf 11 ln)
  6.        pA(dxf 10 an)
  7.        r(dxf 40 an)
  8.        an-s(dxf 50 an)an-e(dxf 51 an)
  9.        is(if(> an-s an-e) t nil)
  10.        PB(inters p10 p11 pA(polar pA(+(* 0.5 pi)(angle p10 p11))100.)nil)
  11.        ang(angle pa pb)
  12. )
  13. (if(and(equal r(distance pA pB) 1e-5)
  14.         (if is(not(> an-s ang an-e))(>= an-e ang an-s))
  15.     )
  16.    t nil)
  17. )



  18. ;;;试验
  19. (defun c:test( / a b)
  20. (setq b(car(entsel"\nLIne:")) a(car(entsel"--ARC:")))
  21. (princ (arc-line a b))
  22. (princ)
  23. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-25 22:22:11 | 显示全部楼层
最初由 aeo 发布
[B]
求出垂线,垂线距离=半径,垂线角度在弧线的起始角和中止角间,这样很方便的. [/B]


同意,提供相关函数代码.


  1.   [FONT=courier new]
  2. ;___________________求点到直线的垂足的函数,输入值测试点,直线端点1,端点2.返回值垂足坐标
  3. (defun pedal_to_line  (pt pt1 pt2)
  4.   (inters
  5.     pt
  6.     (polar pt (+ (/ pi 2) (angle pt1 pt2)) 1000)
  7.     pt1
  8.     pt2
  9.     nil
  10.     )
  11.   )
  12. ;___________________测试点是否在圆弧上,输入值测试点,圆心,起始角度,终止角度.返回值T或者NIL
  13. (defun p_on_arc         (pt cn an1 an2)
  14.   (if (> an1 an2)
  15.     (setq an1 (- an1 (* 2 pi))))
  16.   (or
  17.     (and (>= (+ (angle cn pt) pi pi) an1) (<= (+ (angle cn pt) pi pi) an2))
  18.     (and (>= (angle cn pt) an1) (<= (angle cn pt) an2))
  19.     (and (>= (- (angle cn pt) pi pi) an1) (<= (- (angle cn pt) pi pi) an2))
  20.     )
  21.   )
  22.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-26 01:07:44 | 显示全部楼层
"上楼的:既然求了交点,判断几个就行了,而不用vl方法,求交点要代数求了."
说的对!提醒了我.呵呵.来个一网打尽.

看我的:

  1. ;|判断两个实体是否相切;----------------------------陌生人.2003.12
  2.   函数: (x_tan obj1 obj2 ExtendOption)
  3.   语法: 1.obj1 任意实体; obj2 全段有切线属性的实体,如arc,spline,circle,ellipse.*polyline
  4.         2.ExtendOption: 指定两个对象中是否没有(acExtendNone=0)、第一个(acExtendThisEntity=1),第二个(acExtendOtherEntity=2)
  5.          或两个对象(acExtendBoth=3)延伸来得到交点.
  6.   实例: 1.(x_tan (car(entsel)) (car(entsel)) 2)
  7.         2.(list
  8.            (setvar "osmode" 512)
  9.            (while(not (setq ss (ssget (getpoint "\n选直线:") '((0 . "line"))))))
  10.            (setq obj1 (ssname ss 0))
  11.            (while(not(setq ss (ssget (getpoint "\n选圆弧:") '((0 . "arc"))))))
  12.            (setq obj2 (ssname ss 0))
  13.            (x_tan obj1 obj2 acExtendThisEntity) ;延伸第一个.
  14.           )
  15. |;

  16. (defun x_tan (obj1 obj2 ExtendOption)
  17. (setq pts1 (vla-IntersectWith (vlax-ename->vla-object obj1) (vlax-ename->vla-object obj2) ExtendOption)
  18.        pts2 (vla-IntersectWith (vlax-ename->vla-object obj1) (vlax-ename->vla-object obj2) acExtendboth)
  19.        ints1 (vlax-safearray-get-u-bound (vlax-variant-value pts1) 1)
  20.        ints2 (vlax-safearray-get-u-bound (vlax-variant-value pts2) 1))
  21. (if (= ints1 ints2 2) T nil)
  22. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-26 04:41:42 | 显示全部楼层
最初由 aeo 发布
[B]...还是不对的:假定本来就没相交呢,给你延伸了一下才有了交点.acExtendnone和acExtendBoth都只有一个才是...[/B]


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

使用道具 举报

发表于 2003-12-26 13:27:20 | 显示全部楼层
我的12贴自己测试了几个例子,都通过了.
大家也帮忙测试下:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 21:05 , Processed in 0.409679 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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