明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1885|回复: 1

[源码] 判断点在封闭曲线内外,自交曲线不适用----希望适合UCS

[复制链接]
发表于 2014-11-20 16:41:49 | 显示全部楼层 |阅读模式
本帖最后由 自贡黄明儒 于 2014-11-20 16:45 编辑

希望G版过来看,下面的程序改对了没有。
highflybir大师的程序太复杂了,不好使用http://bbs.mjtd.com/thread-111851-1-1.html
  1. ;;164.42 [功能] 判断点在封闭曲线内外,自交曲线不适用
  2. ;;根据Gu_xl程序改编,希望适合UCS-----自贡黄明儒 2014.11.20
  3. ;;返回: 点在封闭曲线上或曲线内,返回T,否则返回nil
  4. ;;测试: (HH:PtInCurveP  (car(entsel "\n选择曲线:")) (getpoint))
  5. (defun HH:PtInCurveP (POLY PT / CLOCKWISEP CP CURVELENGTH D1 D2 DEV DIST ENDPARAM ISUCS LST LW MAXP MINP PARAM X)
  6.   (setq IsUCS (= (getvar "WORLDUCS") 0))
  7.   (cond (IsUCS (setq pt (trans pt 1 0))))
  8.   (setq cp (vlax-curve-getclosestpointto poly pt))
  9.   (cond
  10.     ((equal pt cp 1e-8) T) ;_ 点在曲线上 T
  11.     ((progn
  12.        (setq lw (vlax-ename->vla-object POLY))
  13.        (vla-GetBoundingBox lw 'MinP 'MaxP)
  14.        (setq MinP (vlax-safearray->list MinP))
  15.        (setq MaxP (vlax-safearray->list MaxP))
  16.        (not (ALG:InCorner-p pt MinP MaxP))
  17.      )
  18.      NIL ;_ 点在曲线最小包围盒外 nil
  19.     )
  20.     (t
  21.      (setq lst (_pnts:box (list MinP MaxP)))        ;4角点
  22.      (setq
  23.        lst (mapcar
  24.        '(lambda (x)
  25.     (vlax-curve-getParamAtPoint
  26.       lw
  27.       (vlax-curve-getClosestPointTo lw x)
  28.     )
  29.         )
  30.        lst
  31.      )
  32.      ) ;_ 最小包围盒点在曲线上的投影点的参数表
  33.      (setq ClockwiseP
  34.       (or
  35.         (<= (car lst) (cadr lst) (caddr lst) (cadddr lst))
  36.         (<= (cadr lst) (caddr lst) (cadddr lst) (car lst))
  37.         (<= (caddr lst) (cadddr lst) (car lst) (cadr lst))
  38.         (<= (cadddr lst) (car lst) (cadr lst) (caddr lst))
  39.       )
  40.      ) ;_ 判断曲线是否为顺时针,顺时针 = T
  41.      (setq endparam (vlax-curve-getendparam poly))
  42.      (setq curvelength (vlax-curve-getDistAtParam poly endparam)) ;_ 曲线长度
  43.      (setq param (vlax-curve-getparamatpoint poly cp))
  44.      (setq dist (vlax-curve-getDistAtParam poly param))
  45.      (if (equal param (fix param) 1e-8)
  46.        (progn
  47.    (cond ((minusp (setq d1 (- dist 1e-8))) (setq d1 (+ curvelength d1))))
  48.    (cond ((> (setq d2 (+ dist 1e-8)) curvelength) (setq d2 (- d2 curvelength))))
  49.    (setq d1 (vlax-curve-getpointatdist poly d1))
  50.    (setq d2 (vlax-curve-getpointatdist poly d2))
  51.    (if (<  (distance pt d1)
  52.     (distance pt d2)
  53.        )
  54.      (setq param d1)
  55.      (setq param d2)
  56.    )
  57.        )
  58.      )
  59.      (setq dev (vlax-curve-getFirstDeriv poly param)
  60.      cp  (vlax-curve-getpointatparam poly param)
  61.      )     
  62.      (= ClockwiseP (minusp (det pt cp (mapcar '+ cp dev))))
  63.     )
  64.   )
  65. )


  66. ;; 判断点是否在窗口内  by highflybir
  67. (defun ALG:InCorner-p (pt pMin pMax)
  68.   (and
  69.     (<= (car pMin) (car pt) (car pMax))
  70.     (<= (cadr pMin) (cadr pt) (cadr pMax))
  71.   )
  72. )
  73. ;;[功能] 两角点变四点(左下 右下 右上 左上)
  74. (defun _pnts:box (box)
  75.   (list  (car box)
  76.   (list (caar box) (cadadr box) (last (car box)))
  77.   (cadr box)
  78.   (list (caadr box) (cadar box) (last (car box)))
  79.   )
  80. )
  81. ;;174.2 [功能] 叉积(外积) By Highflybird
  82. ;;1 三角形之倍面积
  83. ;;2 p1 p2 p3 逆时针为正。
  84. ;;3 三点共线为0
  85. (defun det (p1 p2 p3 / x2 y2)
  86.   (setq  x2 (car p2)
  87.   y2 (cadr p2)
  88.   )
  89.   (- (* (- x2 (car p3)) (- y2 (cadr p1))) (* (- x2 (car p1)) (- y2 (cadr p3))))
  90. )
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2019-7-30 15:30:58 | 显示全部楼层
楼主,发现了错误。点取云线附近会出错。类似下面的提示:“选择曲线:; 错误: 参数类型错误: numberp: (-264910.0 105537.0 0.0)”附件为dwq图纸。请楼主帮检测是什么原因?云线以外程序是正常的。

本帖子中包含更多资源

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

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-18 15:46 , Processed in 0.174344 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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