找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 9191|回复: 45

[分享]:通过算法精确测试点与多边形的位置关系

[复制链接]
发表于 2003-12-10 16:24:29 | 显示全部楼层 |阅读模式

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

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

×
200312101551:
以测试点为起点作超过多边形外框的线段A。
除了测线段A与多边形的各边的交点数(M),
还需要测落在在线段A上的多边形的端点数(N),
以及重合在线段A的多边形边线的条数(O)
如果(REM (- (+ M N) O)2)为1则在多边形内部,否则就在外部。

200312101730:
应 zhynt  的要求改为纯 LISP 版,请大家指正。

  1.   [FONT=courier new]
  2. ;_精确测试点与多边形的位置关系__纯lisp版__BY WKAI __晓东CAD论坛
  3. ;_晓东CAD论坛
  4. ;_200312102049(LM)
  5. ;_200312101730
  6. ;_200312101551
  7. (defun c:tt (/                plendpt           x_lst   e                 op
  8.              n                fst_pt           int_num    online         pc
  9.              pn                min_num           edge_int_num                 pt_online_num
  10.             )
  11.   (setq min_num 0.0001)
  12.   (princ "\n选择多义线:")
  13.   (while (not e) (setq e (car (entsel))))
  14.   (if (= "LWPOLYLINE" (cdr (assoc 0 (entget e))))
  15.     (progn
  16.       (redraw e 3)
  17.       (while (not op) (setq op (getpoint "\n测试点:")))
  18.       (foreach n (entget e)
  19.         (if (= 10 (car n))
  20.           (if plendpt
  21.             (setq plendpt (append plendpt (list (cdr n))))
  22.             (setq plendpt (list (cdr n)))
  23.           )
  24.         )
  25.       )
  26.       (setq X_lst (mapcar '(lambda (x) (car x)) plendpt))
  27.       (setq delta_X (abs (- (apply 'max x_lst) (car op))))
  28.       (setq plendpt          (append plendpt (list (nth 0 plendpt)))
  29.             edge_int_num  0
  30.             pt_online_num 0
  31.       )
  32.       (while (> (length plendpt) 1)
  33.         (setq pc (nth 0 plendpt)
  34.               pn (nth 1 plendpt)
  35.         )
  36.         (if (inters op
  37.                     (polar op 0 (* delta_x 2))
  38.                     pc
  39.                     pn
  40.             )

  41.           (setq edge_int_num (+ 1 edge_int_num))
  42.         )
  43.         (if (equal (angle op pc) 0 min_num)
  44.           (setq pt_online_num (+ 1 pt_online_num))
  45.         )
  46.         (if (and (equal (angle op pc) 0 min_num)
  47.                  (equal (angle op pn) 0 min_num)
  48.             )
  49.           (setq pt_online_num (- pt_online_num 1))
  50.         )
  51.         (if (equal (+ (distance op pc) (distance op pn))
  52.                    (distance pc pn)
  53.                    min_num
  54.             )
  55.           (setq online "t")
  56.         )
  57.         (setq plendpt (cdr plendpt))
  58.       )
  59.       (redraw e 4)
  60.       (if online
  61.         (princ "\n在多边形的边界上.")
  62.         (if (= (rem (+ pt_online_num edge_int_num) 2) 1)
  63.           (princ "\n内部")
  64.           (princ "\n外部")
  65.         )
  66.       )
  67.     )
  68.   )
  69.   (princ)
  70. )
  71. [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2003-12-10 16:26:15 | 显示全部楼层
这个命题很有用,在这以前我一直没有很好的解决,大家帮我测试一下吧。
我做试验用的dwg文件。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-12-10 22:30:59 | 显示全部楼层
只能为多边形,不要有曲线段.

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

使用道具 举报

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

使用道具 举报

发表于 2003-12-14 06:17:44 | 显示全部楼层

Re: [分享]:通过算法精确测试点与多边形的位置关系

最初由 wkai 发布
[B]200312101551: 通过算法精确测试点与多边形的位置关系...[/B]


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

使用道具 举报

 楼主| 发表于 2003-12-14 08:40:17 | 显示全部楼层

Re: Re: [分享]:通过算法精确测试点与多边形的位置关系

最初由 lsjjm 发布
[B]

用(bpoly point) 来判别岂不是更简单? [/B]

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

使用道具 举报

发表于 2003-12-14 16:53:40 | 显示全部楼层
用bpoly可以选择实体范围么?

(续)今天用bply试了一下,觉得用这个方法还是有些漏洞.以下分析,望能赐教
1.不知bploy有没有选择物体的参数,因为用(bpoly pt)的话,就默认以全图实体为搜索边界. 当要测试的实体与其他实体相交(有交集)时候,生成的新曲线面积无法利用,如果用是否生成新物体来判断,显然又是不行,因为点在外面也可能会生成新的曲线
2.当(bpoly pt)生成实体的时候,如果碰到ellipse,spline等,不会生成新的闭合lwpolyline,而是跳出提示,问是否要生成regon. 遇到这种情况如何在程序中判断并处理?我还没想好.

除了以上用数学方法分析外(当然这样写程序会长些),我倾向于用offset一段很小的距离的方法来判断,这样写程序会短些,但是有个担忧,就是offset虽然很小,但是还是有可能(虽然可能性不大)不能生成新实体

另外想问:谁知道xdapi里面的判断是否支持曲线段?
(待续)

做了个测试:

  1. ;|方法2: offset后判断面积
  2. |;
  3. (defun c:ptin2 ()
  4.   ;(setvar "OFFSETDIST" 0.01)
  5.   (setq plsel (entsel)
  6.         pl    (car plsel)   
  7.         plobj (vlax-ename->vla-object pl)
  8.         area1 (vla-get-area plobj))
  9.   (vl-cmdf ".offset" "1" plsel (getpoint "\n取点:") "");;1可按需要调整
  10.   (setq plobj2 (vlax-ename->vla-object (entlast))
  11.         area2 (vla-get-area plobj2))
  12.   (entdel (entlast))
  13.   (if (> area1 area2)
  14.       T      ;点在曲线内
  15.       nil    ;点在曲线外
  16.   )
  17. )

以上程序一般情况下可用,并且支持有曲线段的封闭曲线.
但是:
1.当实体是regon时候不适用
2.当封闭曲线有自相交的时候结果不正常
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-15 05:22:20 | 显示全部楼层
最初由 陌生人 发布
[B]...bply试了一下,觉得用这个方法还是有些漏洞... [/B]


1. BPOLY对1楼所说"多边形" zu gou了
2. 其他曲线可使用BHATCH命令.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-15 14:15:54 | 显示全部楼层
不够,因为用bpoly无法判断(如上所述),另外补充,即便用bpoly,bhatch,boundary 在实际使用的时候常常在封闭区域内无法得出正确的封闭曲线.当图面复杂,曲线实体多的时候尤其如此.
另外探讨一下,用bhatch,或者boundary 如果在程序中调用,使用命令行方式, 输入 /a/b/n...选择物体后无法用"" 终结选取进程,试了n次 也许是bug.有谁试过是可以的么?
长老你的关于(bpoly)方面的使用是从哪里得来的?我找了下cad帮助, 以及上 point a 都没找到相关信息.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-15 16:20:44 | 显示全部楼层
最初由 陌生人 发布
[B]不够,因为用bpoly无法判断...[/B]

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2003-12-16 23:50:30 | 显示全部楼层
你怎么试的?能把程序贴出来么?
我不是说在这两个点无法生成封闭曲线,而是说用bpoly方法无法判断这两个点是否在那个近似星行的闭合曲线内
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 17:40 , Processed in 0.527874 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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