找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 382|回复: 3

[每日一码] 判断点是否在曲线内部

[复制链接]

已领礼包: 19个

财富等级: 恭喜发财

发表于 2020-12-30 19:31:34 | 显示全部楼层 |阅读模式

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

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

×
  1.                                         ; Lee Mac Point Inside Curve
  2. (defun LM:Inside-p
  3.        (pt ent / unit v^v _GroupByNum fd1 fd2 par lst nrm obj tmp)

  4.   (vl-load-com)

  5.   (defun *error* (errmsg)
  6.     (if        (not
  7.           (wcmatch errmsg
  8.                    "Function cancelled,quit / exit abort,console break"
  9.           )
  10.         )
  11.       (princ (strcat "\nError: " errmsg))
  12.     )
  13.     (vla-put-color obj acYellow)
  14.     (princ)
  15.   )

  16.   (defun unit (v / d)
  17.     (if        (not (equal (setq d (distance '(0.0 0.0 0.0) v)) 0.0 1e-8))
  18.       (mapcar '(lambda (x) (/ x d)) v)
  19.     )
  20.   )

  21.   (defun v^v (u v)
  22.     (list
  23.       (- (* (cadr u) (caddr v)) (* (caddr u) (cadr v)))
  24.       (- (* (caddr u) (car v)) (* (car u) (caddr v)))
  25.       (- (* (car u) (cadr v)) (* (cadr u) (car v)))
  26.     )
  27.   )

  28.   (defun _GroupByNum (l n / r)
  29.     (if        l
  30.       (cons (reverse (repeat n
  31.                        (setq r (cons (car l) r)
  32.                              l (cdr l)
  33.                        )
  34.                        r
  35.                      )
  36.             )
  37.             (_GroupByNum l n)
  38.       )
  39.     )
  40.   )

  41.   (if (= (type ent) 'VLA-OBJECT)
  42.     (setq obj ent
  43.           ent (vlax-vla-object->ename ent)
  44.     )
  45.     (setq obj (vlax-ename->vla-object ent))
  46.   )

  47.   (if (vlax-curve-isplanar ent)
  48.     (progn
  49.       (setq fd1        (vlax-curve-getfirstderiv
  50.                   ent
  51.                   (setq par (vlax-curve-getstartparam ent))
  52.                 )
  53.       )
  54.       (while (equal fd1
  55.                     (setq fd2
  56.                            (vlax-curve-getfirstderiv ent (setq par (+ par 0.001)))
  57.                     )
  58.                     1e-3
  59.              )
  60.       )
  61.       (setq nrm (unit (v^v fd1 fd2)))
  62.       (setq lst
  63.              (_GroupByNum
  64.                (vlax-invoke
  65.                  (setq tmp
  66.                         (vlax-ename->vla-object
  67.                           (entmakex
  68.                             (list
  69.                               (cons 0 "RAY")
  70.                               (cons 100 "AcDbEntity")
  71.                               (cons 100 "AcDbRay")
  72.                               (cons 10 pt)
  73.                               (cons 11 (trans '(1. 0. 0.) nrm 0))
  74.                             )
  75.                           )
  76.                         )
  77.                  )
  78.                  'IntersectWith
  79.                  obj
  80.                  acextendnone
  81.                )
  82.                3
  83.              )
  84.       )
  85.       (vla-delete tmp)
  86.       ;; gile:
  87.       (and
  88.         lst
  89.         (not (vlax-curve-getparamatpoint ent pt))
  90.         (= 1
  91.            (rem
  92.              (length
  93.                (vl-remove-if
  94.                  (function
  95.                    (lambda (p / pa p- p+ p0)
  96.                      (setq pa (vlax-curve-getparamatpoint ent p))
  97.                      (and
  98.                        (setq p-
  99.                               (cond
  100.                                 ((setq p- (vlax-curve-getPointatParam
  101.                                             ent
  102.                                             (- pa 1e-8)
  103.                                           )
  104.                                  )
  105.                                  (trans p- 0 nrm)
  106.                                 )
  107.                                 ((trans
  108.                                    (vlax-curve-getPointatParam
  109.                                      ent
  110.                                      (- (vlax-curve-getEndParam ent) 1e-8)
  111.                                    )
  112.                                    0
  113.                                    nrm
  114.                                  )
  115.                                 )
  116.                               )
  117.                        )
  118.                        (setq p+
  119.                               (cond
  120.                                 ((setq p+ (vlax-curve-getPointatParam
  121.                                             ent
  122.                                             (+ pa 1e-8)
  123.                                           )
  124.                                  )
  125.                                  (trans p+ 0 nrm)
  126.                                 )
  127.                                 ((trans        (vlax-curve-getPointatParam
  128.                                           ent
  129.                                           (+ (vlax-curve-getStartParam ent)
  130.                                              1e-8
  131.                                           )
  132.                                         )
  133.                                         0
  134.                                         nrm
  135.                                  )
  136.                                 )
  137.                               )
  138.                        )
  139.                        (setq p0 (trans pt 0 nrm))
  140.                        (<= 0 (* (sin (angle p0 p-)) (sin (angle p0 p+))))
  141.                        ;; LM Mod
  142.                      )
  143.                    )
  144.                  )
  145.                  lst
  146.                )
  147.              )
  148.              2
  149.            )
  150.         )
  151.       )
  152.     )
  153.     (prompt "\nReference curve isn't planar...")
  154.   )
  155. )


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

已领礼包: 5583个

财富等级: 富甲天下

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

使用道具 举报

已领礼包: 3个

财富等级: 恭喜发财

发表于 2022-7-4 22:14:21 | 显示全部楼层
虽然支持自相交曲线,还是有bug的,有时候会出现未知的错误。如果把63行的0.001及65行1e-3的都改成1e-5应该就没啥bug了(待测试)。另外此版本速度较慢,大量检查时有点卡
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 756个

财富等级: 财运亨通

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 22:11 , Processed in 0.364877 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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