找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2290|回复: 23

[弹指神通]:(愚人节礼物)!!!一个巧妙的方法求曲线内部任意一点

[复制链接]
发表于 2005-4-1 00:32:47 | 显示全部楼层 |阅读模式

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

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

×
一个巧妙的方法求曲线内部任意一点
;|
问题: 已知一条闭合多义线(有可能是拟合过的,也可能包含有弧度),
如何求在其区域内的一点的坐标,即只要求出的点的坐标在其区域内即可了。
原帖: http://www.xdcad.net/forum/showt ... 1753206#post1753206
|;


核心程序没有贴完,仅提供思路和框架,有兴趣的可以填空.
以下()处为空缺的一行代码,仅仅一行!!!.
测试可以下载附件,测试命令分别为
    tt1 : 返回(曲线内任意一点 曲线外任意一点)
        tt2 : 测试点是否在曲线内.
        tt3 : 用tt2判断tt1返回的结果.


  1. ;|by 狂刀 .2005.4.1
  2. 参数: e = 曲线实体.
  3.       pt = 指定一点.如返回点,在曲线内;返回nil,在曲线外.
  4.            pt取nil值. 返回 (曲线内任意一点 曲线外任意一点) 供其他程序使用.
  5. |;
  6. (defun getinpt (e p / oce os pt pf an d p1 p2 ee end)
  7.   (princ "\n 判断点pt是否在曲线内或pt=nil时求曲线内任一点.-----by 狂刀 .2005.4.1")
  8.   (setq oce (getvar "cmdecho")
  9.         os (getvar "osmode")
  10.         pt (vlax-curve-getstartpoint e)
  11.         pf ()
  12.         an ()
  13.         d  ()
  14.         p1 (polar pt an 1e-3)
  15.         p2 (polar pt (+ PI an) 1e-3)
  16.         ee (entlast)       
  17.   )
  18.   (setvar "cmdecho" 0)
  19.   (setvar "osmode" 0)
  20.   ()
  21.   (if p
  22.     (if () (setq end nil)(setq end p))
  23.     (if () (setq end (list p2 p1)) (setq end (list p1 p2)))
  24.   )
  25.   ()
  26.   (setvar "cmdecho" oce)
  27.   (setvar "osmode" os)
  28.   end
  29. )


  1. ;;测试程序1: 返回(曲线内任意一点 曲线外任意一点)
  2. ;;因两个点很近,看返回结果单位精度小于4时候显示是一样的,其实是不同的两个点.
  3. (defun c:tt1 (/ e pf an p1 p2 ee d)
  4.   (if (and (setq el (entsel "\n选闭合曲线:"))
  5.            (setq e (car el))
  6.       )
  7.     (if        (not(vl-catch-all-error-p(vl-catch-all-apply 'vlax-curve-getstartpoint (list e))));;判断曲线.
  8.       (print (getinpt e nil))
  9.     )
  10.   )
  11.   (princ)
  12. )
  13. ;;测试程序2: 测试点是否在曲线内.
  14. (defun c:tt2 (/ e p pf an p1 p2 ee d)
  15.   (if (and (setq el (entsel "\n选闭合曲线:"))
  16.            (setq e (car el))
  17.            (setq p (getpoint "\n测试点:"))
  18.       )
  19.     (if        (not(vl-catch-all-error-p(vl-catch-all-apply 'vlax-curve-getstartpoint (list e))));;判断曲线.
  20.       (if (getinpt e p)(princ "\n 点在曲线内")(princ "\n 点在曲线外"))
  21.     )
  22.   )
  23.   (princ)
  24. )
  25. ;;测试程序3:用程序2判断程序1返回的结果. 如果返回"奇怪,难道错了?"那么说明我的程序有bug.
  26. (defun c:tt3 (/ e pt pf an p1 p2 ee d)
  27.   (if (and (setq el (entsel "\n选闭合曲线:"))
  28.            (setq e (car el))
  29.       )
  30.     (if        (not(vl-catch-all-error-p(vl-catch-all-apply 'vlax-curve-getstartpoint (list e))));;判断曲线.
  31.       (if (getinpt e (setq pt (car(getinpt e nil))))
  32.         (mapcar 'princ (list "\n 点" pt "在曲线内"))
  33.         (princ "\n奇怪,难道错了?")
  34.       )
  35.     )
  36.   )
  37.   (princ)
  38. )
  39.   
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-4-1 13:32:24 | 显示全部楼层
你處理的曲線的條件是 卦閉的?    還是不封閉的????   我也是大掃了一眼, 還沒有測試. 先行問問.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-1 14:04:20 | 显示全部楼层
封闭不封闭都可以(如果曲线有内外的话)
但加一个封闭判断会更好。


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

使用道具 举报

发表于 2005-4-2 07:00:00 | 显示全部楼层
题目叙述不太严密: 曲线是没有内外的(在曲线上或非) .
按照内容看应叙述为曲线围合或包容的区域内外?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-4-2 12:58:34 | 显示全部楼层
谢谢提出,来晓东论坛的朋友很多,国内外都有,朋友你现在是在国内还是国外?
哦,对不起,我说的不够严谨,国是没有内外的,按我的意思应该叙述为
朋友你现在是在中华人民共和国国家领土领海领空边界围合或包容的区域内或外?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-12-27 19:36:03 | 显示全部楼层
pt本来是指定的一点,怎么又成了STARTPOINT了,笔误吧?

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2005-12-27 22:09:14 | 显示全部楼层
"曲线上任意一点(比如:firstpoint),沿法线及法线+PI 取两点(距离可取很小)"

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

使用道具 举报

 楼主| 发表于 2005-12-27 23:32:05 | 显示全部楼层
说的对,所以后来改进了。取param=0.5的地方
对付一般的情况足够了,但是对有局部重合的还不完全适用
好老的帖子,我都忘了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2006-9-23 19:38:38 | 显示全部楼层
老大,可否把程序贴完啊,以飨我们这些忠实的支持都
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 196个

财富等级: 日进斗金

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

使用道具 举报

发表于 2006-12-6 19:44:18 | 显示全部楼层
楼主 我等级不够啊 能不能把源程序直接全部贴上来  研究一下啊
谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2008-12-29 22:48:03 | 显示全部楼层
http://www.theswamp.org/index.php?topic=7514.0

俺也弄了一个,不过,过程搞得比较复杂!请大家测试下。

  1.   [FONT=courier new]
  2. (defun c:test1 (/ e)
  3.   (if (setq e (car (entsel "\n请点取封闭曲线:")))
  4.     (th-getpt-incurve-if e nil)
  5.   )
  6. )
  7. (defun c:test2 (/ e mark pt)
  8.   (if (and
  9.         (setq e (car (entsel "\n请点取封闭曲线:")))
  10.         (setq pt (getpoint "\n请选取点:"))
  11.       )
  12.     (progn
  13.       (setq mark (th-getpt-incurve-if e pt))
  14.       (if (= mark "in")
  15.         (princ (strcat "\n点" (vl-princ-to-string pt) "在曲线内。"))
  16.       )
  17.       (if (= mark "on")
  18.         (princ (strcat "\n点" (vl-princ-to-string pt) "在曲线上。"))
  19.       )
  20.       (if (= mark "out")
  21.         (princ (strcat "\n点" (vl-princ-to-string pt) "在曲线外。"))
  22.       )
  23.     )
  24.   )
  25.   (princ)
  26. )
  27.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-25 22:16 , Processed in 0.461563 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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