明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2202|回复: 17

[已解答] 如和判定某一个点是否在由多段线组成的闭合框内?

[复制链接]
发表于 2014-10-22 15:42 | 显示全部楼层 |阅读模式
本帖最后由 katamoto 于 2014-10-22 20:13 编辑

背景:用模型空间获取唯一的一个元素,就是多段线(不是直线)组合成的闭合框,现在要判断某一个指定点是否是在这个闭合框内,如何实现,谢谢大侠
(defun c: ()  
  (vl-load-com)
  (setq myacad (vlax-get-acad-object))
  (setq mydoc (vla-get-activedocument myacad))
  (setq myms (vla-get-modelspace mydoc)
  (setq myen (vla-item myms 0))

(setq pt (list x0 y0 ))
......
......
)

请帮我补充省略号的内容吧,谢谢。可以用GetBoundingBox方法吗,如果多边形外框不规则有凹进去的可以么
 楼主| 发表于 2014-10-22 20:07 | 显示全部楼层
自己给自己钉一下,以防止被沉下去。。。。
发表于 2014-10-22 20:51 | 显示全部楼层
,曲线救国,在要确认的点上画个point,特殊图层,用多线段端点作为ssget的的框选点,如果选得到,就在里面,否则就不在
 楼主| 发表于 2014-10-22 21:13 | 显示全部楼层
这个倒是一个有意思的思路啊,我还真没想到,搜索了一下也没看到有人用过这个方法。。。

ssget框选用2个点表示矩形范围的常见,用多个点框选也可以么,

学的不够,提出问题如果有些小白,莫介意哈。
发表于 2014-10-22 21:28 | 显示全部楼层
  1. (defun ptinpl (pt)
  2. (if (and (setq s1 (entsel "\n选择多义线: "))
  3.          (setq ent (entget(car s1)))
  4.          (= (cdr(assoc 0 ent)) "LWPOLYLINE")) (progn
  5.   (setq ptlst (list))
  6.   (foreach x ent (if (= (car x) 10) (setq ptlst (cons (cdr x) ptlst))))
  7.   (setq anglst (mapcar '(lambda (x) (angle pt x)) ptlst))
  8.   (setq ang (apply '+ (mapcar '- anglst (cdr anglst))))
  9.   (equal ang (+ pi pi) 1e-5)
  10. ))
  11. )
发表于 2014-10-22 22:03 来自手机 | 显示全部楼层
本帖最后由 自贡黄明儒 于 2014-10-23 11:32 编辑

用offset,可能是不错的选择

  1. ;;164.43 [功能] 点在封闭多段线内返回T;线上0;外nil
  2. ;;(PtInorOut (car(entsel))(getpoint))
  3. (defun PtInorOut (en p / AREA AREA1 EN1 PP)
  4.   (setq pp (vlax-curve-getclosestpointto en (trans p 1 0)))
  5.   (if (equal pp p 1e-8)
  6.     0
  7.     (progn
  8.       (setq area (vlax-get (vlax-ename->vla-object en) 'area))
  9.       (command "_.offset" "" en p "")(setq en1(entlast))
  10.       (setq area1 (vlax-get (vlax-ename->vla-object en1) 'area))
  11.       (entdel en1)
  12.       (> area1 area)
  13.     )
  14.   )
  15. )
 楼主| 发表于 2014-10-22 22:48 | 显示全部楼层
ZZXXQQ 发表于 2014-10-22 21:28

能否把最后两行简单解释一下,看了一下,关于这2行其内的算法和语句不是很懂,谢谢。
发表于 2014-10-22 23:32 | 显示全部楼层
轉一圈360度
发表于 2014-10-22 23:42 | 显示全部楼层
射线法,是常用的方法
发表于 2014-10-23 00:03 | 显示全部楼层
本帖最后由 lyqiezi 于 2014-10-23 00:05 编辑

(ssget "wp" ptlist)可以选择
还有一个思路,找出距离目标点最近的一个端点,将目标点插在最近端点的前后各一次,计算n+1点多线段围成的面积(原先为n点多线段),只要有一次面积比原面积小,判断为框框内,两次都大,判断为框框外。
当然,这个只是一个猜想,也不懂怎么证明
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-29 15:56 , Processed in 0.197345 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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