相交多段线如何判断在内或者是在外,还请大神解答,谢谢!
如上图所示,三条多段线相交于点A,现在用(ssget "_CP")来提取,需要提取红色多段线内那条黄色多段线的坐标,但是又不想提取那条蓝色的多段线,请问各位大大,怎么判断一个在红色多段线内一个在外啊?
判断所选中的多线段的节点
是否有在红色多段线范围外的点
(ssget "_WP")不行的话,你就取多段线上的点,来判断。(ssget "_CP")选择到的对象,如果有一点在封闭曲线内,则.... 自贡黄明儒 发表于 2014-2-19 10:44 static/image/common/back.gif
(ssget "_WP")不行的话,你就取多段线上的点,来判断。(ssget "_CP")选择到的对象,如果有一点在封闭曲线内 ...
经过黄大的提醒,突然想到好像之前看过一篇判断点是否在多段线内的帖子,呵呵,就是"llsheng_73"大大写的那篇用选择集判断的那个,看过之后幡然醒悟,于是小弟根据自己平时的工作,就有了一个小小的思路:依次得到多段线和需要判断的多段线的顶点表,然后在需要判断的多段线的顶点上依次创建点,只要有一个点在内,就判断其在内,所以最后判断(ssget "_wp" plist)是否存在,若存在就判断为在内,若不存在就判断在外。
于是,就有了:
(defun c:tt()
(setq en (entget (car (entsel))))
(setq wbiao nil)
(foreach lst en
(if (= 10 (car lst))
(setq wbiao (append wbiao (list (cdr lst))))
)
) ;此处得到外围多段线的顶点坐标
(setq ent (entget (car (entsel))))
(setq pbiao nil)
(foreach plst ent
(if (= 10 (car plst))
(setq pbiao (append pbiao (list (cdr plst))))
)
);此处得到需要判断的多段线的顶线坐标
(setq i 0);初始化变量i准备循环
(setq panduan nil);初始化变量"puanduan"最后看判断是否存在。
(repeat (length pbiao);循环开始
(setq dingdian (nth i pbiao));提取需要判断的多段线的各个顶点
(entmake (list (cons 0 "POINT") (cons 8 "0") (list 10 (car dingdian) (cadr dingdian) 0)));在顶点处创建点
(if (setq tuyuanbiao (ssget "_wp" wbiao '((0 . "POINT") (8 . "0"))));判断(ssget "_wp" wbiao)是否有值
(setq panduan 1);若有值,则将变量"panduan"赋值为1
)
(entdel (entlast));删除创建的点
(setq i (1+ i))
)
(if panduan
(print "在内")
(print "在外")
)
(princ);完了!
)
写得不好,还请各位看官多多指点!
最后谢谢"llsheng_73"大大的思路,谢谢黄大的提醒 如果你的多形不是凹弧,则不用 (entmake (list (cons 0 "POINT"),因为包函点的多边形必须在可视范围内。 本帖最后由 llsheng_73 于 2014-2-20 10:15 编辑
如果能保证都是凸多边形的话还可以更省事,那就是可以把它们当成圆对待。。。
很明显,两个圆的关系决定于圆心距和半径之和与差,但多线段没有半径,也就是说只能确定它们的中心,那么用(ssget "F"(list 中心1 中心2))也是可以判断出凸多线段之间的关系的
另一个办法,好象可能通过填充来解决,如果在一个多边形内取一点进行填充所得到的面积=两个多线段面积之差,那么面积小的那个多边形它就是被另一个所包含的
以上都只是想到的思路,基本没有考虑效率问题哈 llsheng_73 发表于 2014-2-20 10:05 static/image/common/back.gif
如果能保证都是凸多边形的话还可以更省事,那就是可以把它们当成圆对待。。。
很明显,两个圆的关系决定于 ...
谢谢,好思路,我这边工作中的多边形是不固定的,什么形状都有,但就只是多段线,不会出现圆弧! 自贡黄明儒 发表于 2014-2-20 08:14 static/image/common/back.gif
如果你的多形不是凹弧,则不用 (entmake (list (cons 0 "POINT"),因为包函点的多边形必须在可视范围内。
额......没太明白黄大的意思,不用(entmake (list (cons 0 "POINT")???
这不是在创建点么?
我知道用(ssget "_wp")和(ssget "_CP")必须使多段线在可视范围内,不然里面的东西就选不到,但是如果不创建点又该怎么做呢? 顶~~~~~~~~~~~~~~~~~~~~~~~~~ 新人学习中
页:
[1]