找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1334|回复: 2

[研讨] [原创]:射线法及角度法求解点是否在曲线内[角度法在4楼]

[复制链接]

已领礼包: 24个

财富等级: 恭喜发财

发表于 2013-5-3 17:20:55 | 显示全部楼层 |阅读模式

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

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

×
今天先贴射线法,明天再贴角度法,均支持各种曲线的测试
[pcode=lisp,true]
(DEFUN InCurve (pt ent / COUNT TMPRAY)
  (IF (EQUAL pt (VLAX-CURVE-GETCLOSESTPOINTTO ent pt) 1E-6)
    (ALERT \"***点在线上***\")
    (PROGN (SETQ ent        (VLAX-ENAME->VLA-OBJECT ent)
                 TmpRay        (VLAX-ENAME->VLA-OBJECT
                          (ENTMAKEX (LIST \'(0 . \"RAY\")
                                          \'(100 . \"AcDbEntity\")
                                          \'(100 . \"AcDbRay\")
                                          (CONS 10 pt)
                                          (CONS 11 (MAPCAR \'+ pt \'(1 0)))
                                          ;;相当于(polar pt 0 1)
                                    )
                          )
                        )
                 pt        (VLAX-3D-POINT pt)
                 Count        0
           )
           ;;可根据需要调整扫描角度提高检索速度,本程序采用12度
           (REPEAT 30
             (VLA-ROTATE TmpRay pt (/ PI 15))
             ;;下面这句可以看到扫描过程,实际使用时可以注释掉
             ;;(COMMAND \"delay\" 50)
             (IF (ZEROP
                   (REM        (LENGTH        (VLAX-INVOKE ent \'INTERSECTWITH TmpRay ACEXTENDNONE)
                        )
                        6
                   )
                 )
               (SETQ Count (1- Count))
               (SETQ Count (1+ Count))
             )
           )
           (VLA-DELETE TmpRay)
           (IF (MINUSP Count)
             (ALERT \"***点在线外***\")
             (ALERT \"***点在线内***\")
           )
    )
  )
  (PRINC)
)
[/pcode]

[pcode=lisp,true]
(DEFUN C:test (/ Curve Pt)
  (IF (SETQ Curve (CAR (ENTSEL \"\\n选择一条曲线:\")))
    (WHILE (SETQ Pt (GETPOINT \"\\n点取测试点:\"))
      (InCurve Pt Curve)
    )
  )
  (PRINC)
)
[/pcode]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-5-3 18:46:25 | 显示全部楼层
我也来贴一个:
[pcode=lisp,true];;功能:判断点在封闭曲线内外,自交曲线不适用 By Gu_xl 2012.07.31
;;返回: 点在封闭曲线上或曲线内,返回T,否则返回nil
;;测试: (gxl-PtInCurveP  (car(entsel "\n选择曲线:")) (getpoint))
(defun gxl-PtInCurveP  (POLY PT           /           CP           LW
                                   MINP           MAXP           MINX           MINY
                                   MAXX           MAXY           X           Y
                                   LST           CLOCKWISEP           ENDPARAM
                                   CURVELENGTH           PARAM   DIST
                                   D1           D2           DEV           )
  (cond
    ((equal pt
            (setq cp (vlax-curve-getclosestpointto poly pt))
            1e-8)) ;_ 点在曲线上 T
    ((progn
       (vla-GetBoundingBox
         (setq lw (vlax-ename->vla-object POLY))
         'MinP
         'MaxP)
       (setq MinP (vlax-safearray->list MinP))
       (setq MaxP (vlax-safearray->list MaxP))
       (setq minx (car MinP)
             miny (cadr MinP)
             maxx (car MaxP)
             maxy (cadr MaxP)
             x          (car pt)
             y          (cadr pt)
             )
       (or (< x minx)
           (> x maxx)
           (< y miny)
           (> y maxy)
           )
       )
     NIL ;_ 点在曲线最小包围盒外 nil
     )
    (t
     (setq
       lst (mapcar
             (function
               (lambda (x)
                 (vlax-curve-getParamAtPoint
                   lw
                   (vlax-curve-getClosestPointTo lw x)
                   )
                 )
               )
             (list minp
                   (list minx maxy)
                   MaxP
                   (list maxx miny)
                   )
             )
       ) ;_ 最小包围盒点在曲线上的投影点的参数表
     (setq ClockwiseP
            (if        (or
                  (<= (car lst) (cadr lst) (caddr lst) (cadddr lst))
                  (<= (cadr lst) (caddr lst) (cadddr lst) (car lst))
                  (<= (caddr lst) (cadddr lst) (car lst) (cadr lst))
                  (<= (cadddr lst) (car lst) (cadr lst) (caddr lst))
                  ) ;_  or
              t
              ) ;_  if
           ) ;_ 判断曲线是否为顺时针,顺时针 = T
     (setq endparam    (vlax-curve-getendparam poly)
           curvelength (vlax-curve-getDistAtParam poly endparam) ;_ 曲线长度
           )
     (setq param (vlax-curve-getparamatpoint poly cp)
           dist         (vlax-curve-getDistAtParam poly param)
           )
     (if (equal param (fix param) 1e-8)
       (progn
         (setq d1 (- dist 1e-8))
         (if (minusp d1)
           (setq d1 (+ curvelength d1))
           )
         (setq d2 (+ dist 1e-8))
         (if (> d2 curvelength)
           (setq d2 (- d2 curvelength)))
         (if (<        (distance pt (vlax-curve-getpointatdist poly d1))
                (distance pt (vlax-curve-getpointatdist poly d2))
                )
           (setq param (vlax-curve-getparamatdist poly d1))
           (setq param (vlax-curve-getparamatdist poly d2))
           )
         )
       )
     (setq dev (vlax-curve-getFirstDeriv poly param)
           cp  (vlax-curve-getpointatparam poly param)
           )
     (=        ClockwiseP
        (
         (lambda (p1 p2 p3)
           (<
             (* (- (car p2) (car p1)) (- (cadr p3) (cadr p1)))
             (* (- (cadr p2) (cadr p1)) (- (car p3) (car p1)))
             )
           )
          pt
          cp
          (mapcar '+ cp dev)
          )
        )
       )
    )
  )[/pcode]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-5-3 19:04:06 | 显示全部楼层

更多的讨论和算法见:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 10:57 , Processed in 0.406040 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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