重慶崽兒 发表于 2014-2-18 23:12:13

相交多段线如何判断在内或者是在外,还请大神解答,谢谢!


如上图所示,三条多段线相交于点A,现在用(ssget "_CP")来提取,需要提取红色多段线内那条黄色多段线的坐标,但是又不想提取那条蓝色的多段线,请问各位大大,怎么判断一个在红色多段线内一个在外啊?

Student 发表于 2014-2-19 08:51:19

判断所选中的多线段的节点
是否有在红色多段线范围外的点

自贡黄明儒 发表于 2014-2-19 10:44:22

(ssget "_WP")不行的话,你就取多段线上的点,来判断。(ssget "_CP")选择到的对象,如果有一点在封闭曲线内,则....

重慶崽兒 发表于 2014-2-19 20:20:46

自贡黄明儒 发表于 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"大大的思路,谢谢黄大的提醒

自贡黄明儒 发表于 2014-2-20 08:14:42

如果你的多形不是凹弧,则不用 (entmake (list (cons 0 "POINT"),因为包函点的多边形必须在可视范围内。

llsheng_73 发表于 2014-2-20 10:05:29

本帖最后由 llsheng_73 于 2014-2-20 10:15 编辑

如果能保证都是凸多边形的话还可以更省事,那就是可以把它们当成圆对待。。。
很明显,两个圆的关系决定于圆心距和半径之和与差,但多线段没有半径,也就是说只能确定它们的中心,那么用(ssget "F"(list 中心1 中心2))也是可以判断出凸多线段之间的关系的

另一个办法,好象可能通过填充来解决,如果在一个多边形内取一点进行填充所得到的面积=两个多线段面积之差,那么面积小的那个多边形它就是被另一个所包含的

以上都只是想到的思路,基本没有考虑效率问题哈

重慶崽兒 发表于 2014-2-20 20:28:25

llsheng_73 发表于 2014-2-20 10:05 static/image/common/back.gif
如果能保证都是凸多边形的话还可以更省事,那就是可以把它们当成圆对待。。。
很明显,两个圆的关系决定于 ...

谢谢,好思路,我这边工作中的多边形是不固定的,什么形状都有,但就只是多段线,不会出现圆弧!

重慶崽兒 发表于 2014-2-20 20:31:32

自贡黄明儒 发表于 2014-2-20 08:14 static/image/common/back.gif
如果你的多形不是凹弧,则不用 (entmake (list (cons 0 "POINT"),因为包函点的多边形必须在可视范围内。

额......没太明白黄大的意思,不用(entmake (list (cons 0 "POINT")???
这不是在创建点么?
我知道用(ssget "_wp")和(ssget "_CP")必须使多段线在可视范围内,不然里面的东西就选不到,但是如果不创建点又该怎么做呢?

chbddzx12 发表于 2015-7-12 18:12:29

顶~~~~~~~~~~~~~~~~~~~~~~~~~

ltrliu 发表于 2015-8-21 09:40:46

新人学习中
页: [1]
查看完整版本: 相交多段线如何判断在内或者是在外,还请大神解答,谢谢!