明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2157|回复: 9

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

[复制链接]
发表于 2014-2-18 23:12:13 | 显示全部楼层 |阅读模式

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

本帖子中包含更多资源

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

x
发表于 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
(ssget "_WP")不行的话,你就取多段线上的点,来判断。(ssget "_CP")选择到的对象,如果有一点在封闭曲线内 ...

经过黄大的提醒,突然想到好像之前看过一篇判断点是否在多段线内的帖子,呵呵,就是"llsheng_73"大大写的那篇用选择集判断的那个,看过之后幡然醒悟,于是小弟根据自己平时的工作,就有了一个小小的思路:依次得到多段线和需要判断的多段线的顶点表,然后在需要判断的多段线的顶点上依次创建点,只要有一个点在内,就判断其在内,所以最后判断(ssget "_wp" plist)是否存在,若存在就判断为在内,若不存在就判断在外。
于是,就有了:
  1. (defun c:tt()
  2.   (setq en (entget (car (entsel))))
  3.   (setq wbiao nil)
  4.   (foreach lst en
  5.     (if (= 10 (car lst))
  6.       (setq wbiao (append wbiao (list (cdr lst))))
  7.     )
  8.   ) ;此处得到外围多段线的顶点坐标
  9.   (setq ent (entget (car (entsel))))
  10.   (setq pbiao nil)
  11.   (foreach plst ent
  12.     (if (= 10 (car plst))
  13.       (setq pbiao (append pbiao (list (cdr plst))))
  14.     )
  15.   );此处得到需要判断的多段线的顶线坐标
  16.   (setq i 0);初始化变量i准备循环
  17.   (setq panduan nil);初始化变量"puanduan"最后看判断是否存在。
  18.   (repeat (length pbiao);循环开始
  19.     (setq dingdian (nth i pbiao));提取需要判断的多段线的各个顶点
  20.     (entmake (list (cons 0 "POINT") (cons 8 "0") (list 10 (car dingdian) (cadr dingdian) 0)));在顶点处创建点
  21.     (if (setq tuyuanbiao (ssget "_wp" wbiao '((0 . "POINT") (8 . "0"))));判断(ssget "_wp" wbiao)是否有值
  22.       (setq panduan 1);若有值,则将变量"panduan"赋值为1
  23.     )
  24.     (entdel (entlast));删除创建的点
  25.     (setq i (1+ i))
  26.   )
  27.   (if panduan
  28.     (print "在内")
  29.     (print "在外")
  30.   )
  31.   (princ);完了!

  32. )

写得不好,还请各位看官多多指点!
最后谢谢"llsheng_73"大大的思路,谢谢黄大的提醒

点评

狂汗。。。。。我也是仰望大大们的  发表于 2014-2-20 10:06
发表于 2014-2-20 08:14:42 | 显示全部楼层
如果你的多形不是凹弧,则不用 (entmake (list (cons 0 "POINT"),因为包函点的多边形必须在可视范围内。
发表于 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
如果能保证都是凸多边形的话还可以更省事,那就是可以把它们当成圆对待。。。
很明显,两个圆的关系决定于 ...

谢谢,好思路,我这边工作中的多边形是不固定的,什么形状都有,但就只是多段线,不会出现圆弧!
 楼主| 发表于 2014-2-20 20:31:32 | 显示全部楼层
自贡黄明儒 发表于 2014-2-20 08:14
如果你的多形不是凹弧,则不用 (entmake (list (cons 0 "POINT"),因为包函点的多边形必须在可视范围内。

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

点评

http://bbs.mjtd.com/thread-108149-1-1.html 5楼  发表于 2014-2-21 09:15
发表于 2015-7-12 18:12:29 | 显示全部楼层
顶~~~~~~~~~~~~~~~~~~~~~~~~~
发表于 2015-8-21 09:40:46 | 显示全部楼层
新人学习中
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-7-16 04:14 , Processed in 0.204463 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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