找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: 狂刀

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

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

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2008-12-30 15:38:27 | 显示全部楼层
源码

  1.   [FONT=courier new]
  2. (setq %24pai (* pi 0.5))
  3. ;;; ==================================================================
  4. ;;; 判断点在曲线内与否。在曲线内,返回"in",在曲线上,返回"on"
  5. ;;; 在曲线外,返回"out".若pt为nil,则返回曲线内一点
  6. (defun th-getpt-incurve-if (ename pt)
  7.   (if pt
  8.     (th-if-pt-in-curve pt ename)
  9.     (th-get-pt-in-curve ename)
  10.   )
  11. )
  12. ;;; ==================================================================
  13. ;;; 返回曲线内一点
  14. (defun th-get-pt-in-curve (ename / ang len mark pt pt1 pt2 ptin)
  15.   (setq len (t2-get-curve-length ename))
  16.   (if (< len 100)
  17.     (setq len 100)
  18.     (setq len (fix len))
  19.   )
  20.   (setq mark t)
  21.   (while mark
  22.     (setq pt (th-m/n-pt-curve ename (txt-rnd-r 1 (1- len)) len))
  23.     (setq ang (th-get-tangent@pt ename pt))
  24.     (setq pt1 (polar pt (+ ang %24pai) 1e-3))
  25.     (setq pt2 (polar pt (- ang %24pai) 1e-3))
  26.     (if (= "in" (th-if-pt-in-curve pt1 ename))
  27.       (setq ptin pt1
  28.             mark nil
  29.       )
  30.     )
  31.     (if (= "in" (th-if-pt-in-curve pt2 ename))
  32.       (setq ptin pt2
  33.             mark nil
  34.       )
  35.     )
  36.   )
  37.   ptin
  38. )
  39. ;;; ==================================================================
  40. ;;; 返回曲线上的m/n等分点。如(th-m/n-pt-curve (car(entsel)) 80 100)
  41. (defun th-m/n-pt-curve (ename m n / curlen pt)
  42.   (setq curlen (t2-get-curve-length ename))
  43.   (and
  44.     (<= 0 m n)
  45.     (setq pt (vlax-curve-getpointatdist ename (* m (/ curlen n) 1.0)))
  46.   )
  47.   pt
  48. )
  49. ;;; ==================================================================
  50. ;;; 返回曲线长度
  51. (defun t2-get-curve-length (e)
  52.   (if (vlax-property-available-p (vlax-ename->vla-object e) "length")
  53.     (vla-get-length (vlax-ename->vla-object e))
  54.     0
  55.   )
  56. )
  57. ;;; ==================================================================
  58. ;;; 返回曲线上某点的切线角
  59. (defun th-get-tangent@pt (obj pnt / curpar pntlst tmppnt)
  60.   (setq pntlst (th-get-endpts obj)
  61.         curpar (cond
  62.                  ((equal pnt (car pntlst) 1e-5)
  63.                    (vlax-curve-getstartparam obj)
  64.                  )
  65.                  ((equal pnt (cadr pntlst) 1e-5)
  66.                    (vlax-curve-getendparam obj)
  67.                  )
  68.                  ((setq tmppnt (vlax-curve-getclosestpointto obj pnt))
  69.                    (if (<= (distance tmppnt pnt) 1e-5)
  70.                      (vlax-curve-getparamatpoint obj tmppnt)
  71.                    )
  72.                  )
  73.                  (t
  74.                    nil
  75.                  )
  76.                )
  77.   )
  78.   (if curpar
  79.     (angle '(0.0 0.0 0.0) (vlax-curve-getfirstderiv obj curpar))
  80.   )
  81. )
  82. ;;; ==================================================================
  83. ;;; 返回始终点列表
  84. (defun th-get-endpts (obj)
  85.   (list (vlax-curve-getstartpoint obj) (vlax-curve-getendpoint obj))
  86. )
  87. ;;; ==================================================================
  88. ;;; 判断点在曲线内与否。在曲线内,返回"in",在曲线上,返回"on"
  89. ;;; 在曲线外,返回"out".
  90. (defun th-if-pt-in-curve (pt ent / count mark tmpray)
  91.   (if (equal pt (vlax-curve-getclosestpointto ent pt) 1e-6)
  92.     (setq mark "on")
  93.     (progn
  94.       (setq ent (vlax-ename->vla-object ent)
  95.             tmpray (vlax-ename->vla-object (entmakex (list '(0 . "RAY") '
  96.                                                            (100 . "AcDbEntity")
  97.                                                            '(100 . "AcDbRay")
  98.                                                            (cons 10 pt)
  99.                                                            (cons 11
  100.                                                                  (polar pt
  101.                                                                         (txt-rnd-r 0 pi)
  102.                                                                         1
  103.                                                                  )
  104.                                                            )
  105.                                                      )
  106.                                            )
  107.                    )
  108.             pt (vlax-3d-point pt)
  109.             count 0
  110.       )
  111.       (repeat 60
  112.         (vla-rotate tmpray pt (/ pi 30))
  113.         (if (zerop (rem (length (vlax-invoke ent 'intersectwith tmpray 0)) 6))
  114.           (setq count (1- count))
  115.           (setq count (1+ count))
  116.         )
  117.       )
  118.       (vla-delete tmpray)
  119.       (if (minusp count)
  120.         (setq mark "out")
  121.         (setq mark "in")
  122.       )
  123.     )
  124.   )
  125.   mark
  126. )
  127. ;;; ==================================================================
  128. ;;; 求随机数(0~1)--by 狂刀
  129. (defun txt-rnd ()                      ; 随机数种子
  130.   (* (rem (getvar "cputicks") 1e3) 1e-3)
  131. )
  132. ;;; 求n个a~b随机数列表----by 狂刀
  133. (defun txt-rnd-rlst (a b n / c lst)    ; 随机数表
  134.   (setq c (- b a))
  135.   (repeat n
  136.     (setq lst (cons (+ a (* (txt-rnd) c)) lst))
  137.   )
  138. )
  139. (defun txt-rnd-r (a b)                 ; 单个随机数
  140.   (car (txt-rnd-rlst a b 1))
  141. )
  142. ;;; ==================================================================
  143. (defun c:test1 (/ e)
  144.   (if (setq e (car (entsel "\n请点取封闭曲线:")))
  145.     (th-getpt-incurve-if e nil)
  146.   )
  147. )
  148. (defun c:test2 (/ e mark pt)
  149.   (if (and
  150.         (setq e (car (entsel "\n请点取封闭曲线:")))
  151.         (setq pt (getpoint "\n请选取点:"))
  152.       )
  153.     (progn
  154.       (setq mark (th-getpt-incurve-if e pt))
  155.       (if (= mark "in")
  156.         (princ (strcat "\n点" (vl-princ-to-string pt) "在曲线内。"))
  157.       )
  158.       (if (= mark "on")
  159.         (princ (strcat "\n点" (vl-princ-to-string pt) "在曲线上。"))
  160.       )
  161.       (if (= mark "out")
  162.         (princ (strcat "\n点" (vl-princ-to-string pt) "在曲线外。"))
  163.       )
  164.     )
  165.   )
  166.   (princ)
  167. )
  168. ;;; ==================================================================

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

使用道具 举报

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

使用道具 举报

发表于 2008-12-31 01:53:09 | 显示全部楼层
楼主是采用偏移面积比较法写的
用这方法有种情况会不适合
当曲线有交叉情况时,
面积比较就会出问题的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2009-4-21 21:32:05 | 显示全部楼层
楼上能否说说您实现点在闭合曲线内的思路?感谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2009-5-21 20:53:16 | 显示全部楼层
我实现的思路是这样的:
将闭合曲线和要判断的点位,均辅助生成实体(点可画很小的圆,再生成实体),然后对两实体进行交集判断,当交集为真,则点在闭合曲线内,当交集为假则不在闭合曲线内。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-16 06:32 , Processed in 0.183817 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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