找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: wkai

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

[复制链接]
发表于 2003-12-17 04:36:03 | 显示全部楼层
最初由 陌生人 发布
[B]你怎么试的?能把程序贴出来么?...[/B]

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

使用道具 举报

 楼主| 发表于 2003-12-17 08:25:37 | 显示全部楼层
最初由 lsjjm 发布
[B]
很简单的:
(defun ptinside (pt)
  (if (bpoly p)
    (progn (vl-cmdf "erase" (entlast) "") T)
    nil
  )
) [/B]

bpoly这个函数没有见过呀.
请问,lsjjm 大侠 AUTOLISP 中到底还有多少这种没有介绍的函数呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-17 12:15:01 | 显示全部楼层
BPOLY有两种形式: 命令BPOLY和函数(BPOLY PT).
这是R12以后增加的用于补充和加强HATCH的功能.新版中其功能为BOUNADRY所代替, 旧的命令及函数仍保留, 但在帮助文件里是看不到了.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-17 20:13:04 | 显示全部楼层
最初由 lsjjm 发布
[B]
很简单的:
(defun ptinside (pt)
  (if (bpoly p)
    (progn (vl-cmdf "erase" (entlast) "") T)
    nil
  )
) [/B]


对啊,这正是我要说的,这样的测试无法确定点是否在某个封闭曲线内部.因为如果你点在这个曲线的外面,也有可能获得(bpoly pt)生成的实体,(当这个点的位置被其他实体"封闭"在某个封闭空间内的时候)
所以,bpoly 是无法用来判定的.
如图例中的两个点,都能正确生成新的曲线,但是相对于星形的封闭曲线,他们一个在内,一个在外.
看来你没明白我所提出的问题.


来了3次,我还是最后一贴,只好用编辑:(
今天做了个测试点在曲线内外的程序,是用构造xline,求交点排序位置的方法.

测试:
(c:ptin)
出错! 未选中曲线
_$ (c:ptin)
点在曲线外
_$ (c:ptin)
点在曲线内
_$ (c:ptin)
点在曲线上:
_$

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

使用道具 举报

发表于 2003-12-18 03:27:41 | 显示全部楼层
最初由 陌生人 发布
[B]...他们一个在内,一个在外.看来你没明白我所提出的问题...[/B]


我怎么会不明白?
如此简单的程序只是显示一个基本的功能或者si 路.  还需要你发hui和完shan. 例如隐藏其他实体...?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-19 00:23:11 | 显示全部楼层
听你一说,我茅塞顿开.
这个方法我原来连想都没有去想,因为为了一个检测而对全图其他实体隐藏再显示,真是杀鸡用牛刀.如果图大,redraw一便也是会感觉明显的延迟,即便机子再快.
不过作为思维的严谨性,这个确实是一种思路,虽然打死我不会这样去作.

再:我的观点:用bpoly还是无法做出测试程序!
因为如果对 封闭的spline,ellipse测试, 会被迫中断退出.必须回答那个
讨厌的"Polyline boundary could not be derived. Create Region? <Y>"
我试了,这个回答(y)无法在程序的命令行语句中完成.
这样程序就无法正常进行下去,而且后续的恢复实体显示也只好在退出后用另外的程序来完成.
测试如下:
Command: el ELLIPSE
Specify axis endpoint of ellipse or [Arc/Center]:
Specify other endpoint of axis:
Specify distance to other axis or [Rotation]:
Command: (bpoly (getpoint))
<图元名: 400ad9f8>
Polyline boundary could not be derived. Create Region? <Y>

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

使用道具 举报

发表于 2003-12-19 04:16:49 | 显示全部楼层
1. 这是一种思路, 但更是一种解决问题的方法, 而且是不错的方法( 喜好繁琐, 有误的计算?)
  解决问题有许多方法, gan ma fei de zai yi ke shu shang diao si ?!
2. 我测试了ELLIPSE, SPLINE完全可以 !
3. 测试上面那个程序了吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-19 06:14:33 | 显示全部楼层
测试了.我用的是cad2002  ,用 (ptinside (getpoint)) 调用
对el,sp无论点在内,在外都返回nil, 你用cad2004?
其他人效果如何?不会是我的cad问题吧?呵呵,别的功能没什么异样啊.或者是有什么参数?
不管了,先睡觉.88
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2004-3-1 11:08:52 | 显示全部楼层
楼主的程序对于附图的情况,直线的两个端点在矩形外面,可是测出来一个在内,一个在外
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-1 13:36:54 | 显示全部楼层
斗胆改了一下程序,不知道改得对不对,请大家指教:

  1.   [FONT=courier new]
  2. ;以测试点为起点作超过多边形外框的线段A。
  3. ;除了测线段A与多边形的各边的交点数(M),
  4. ;还需要测落在在线段A上的多边形的端点数(N),
  5. ;以及重合在线段A的多边形边线的条数(O)
  6. ;如果(REM (- (+ M N) O)2)为1则在多边形内部,否则就在外部。

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

  48.           (setq edge_int_num (+ 1 edge_int_num))
  49.         )
  50.         (if (equal (+ (distance op pc) (distance pc op1))
  51.                    (distance op op1)
  52.                    min_num)
  53.           (setq pt_online_num (+ 1 pt_online_num))
  54.         )
  55. ;        (if (and (equal (angle op pc) pi min_num)
  56. ;                 (equal (angle op pn) pi min_num)
  57. ;            )
  58. ;          (setq pt_online_num (- pt_online_num 1))
  59. ;        )
  60.         (if (equal (+ (distance op pc) (distance op pn))
  61.                    (distance pc pn)
  62.                    min_num
  63.             )
  64.           (setq online "t")
  65.         )
  66.         (setq plendpt (cdr plendpt))
  67.       )
  68.       (redraw e 4)
  69.       (if online
  70.         (princ "\n在多边形的边界上.")
  71.         (if (= (rem (+ pt_online_num edge_int_num) 2) 1)
  72.           (princ "\n内部")
  73.           (princ "\n外部")
  74.         )
  75.       )
  76.     )
  77.   )
  78.   (princ)
  79. )

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

使用道具 举报

发表于 2004-3-3 08:59:25 | 显示全部楼层
最初由 小菜 发布
[B]楼主的程序对于附图的情况,直线的两个端点在矩形外面,可是测出来一个在内,一个在外 [/B]


试试这个:
(defun isinside (p ent)
  (command "_.area" "_O" ent)
  (setq earea (getvar "AREA"))
  (command "_.offset" 0.01 ent p "" "_.area" "_O"
    (setq nent (entlast))
  )
  (entdel nent)
  (> earea (getvar "AREA"))
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-3 09:05:39 | 显示全部楼层
楼上这个程序不对吧?如果点在另一个矩形内,而在我想测的这个矩形外面,结果就不对了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-3 10:14:46 | 显示全部楼层
最初由 小菜 发布
[B]楼上这个程序不对吧?如果点在另一个矩形内,而在我想测的这个矩形外面,结果就不对了 [/B]


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-1 04:20 , Processed in 0.430614 second(s), 53 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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