明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 荒野孤行

[已解答] 判断同一条多段线是否有交叉点,并求出其坐标点

[复制链接]
发表于 2014-6-24 11:31:35 | 显示全部楼层
logoin 发表于 2014-6-23 22:55
这个要写出来容易,要高效率就难了,楼主CAD是什么版本,有空给你写一个基于计算几何算法的.net程序,在上万 ...

也想学习学习,上次找到个用来判断三点顺逆时针的算法就是C语言之类的,具体是那种也我也分不清。改成LISP也成功的。
回复

使用道具 举报

发表于 2014-6-24 19:48:11 | 显示全部楼层
本帖最后由 wzg356 于 2014-6-24 19:50 编辑

1,取出多线段坐标
2、按多线段坐标顺序画直线line,并保存直线清单(每段直线一个名字)
3、逐条判断直线是否与其它直线相交,相交就取出交点。
4、删除直线
回复

使用道具 举报

 楼主| 发表于 2014-6-25 00:14:55 | 显示全部楼层
wzg356 发表于 2014-6-24 19:48
1,取出多线段坐标
2、按多线段坐标顺序画直线line,并保存直线清单(每段直线一个名字)
3、逐条判断直线 ...

如果多段线中有圆弧,那怎么判断自交点?如图:

本帖子中包含更多资源

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

x
回复

使用道具 举报

 楼主| 发表于 2014-6-25 00:59:23 | 显示全部楼层
本帖最后由 荒野孤行 于 2014-6-25 01:00 编辑
Gu_xl 发表于 2014-6-23 13:01
如果偏移后个数为1,再进一步判断!再将偏移后的对象偏移回去,计算偏移回去的对象长度是否和源多段线长度 ...

按照这种思路写的,但是有问题,盼解决,以下是源码:

;;;******查找自相交对象 程序开始*****
(defun c:t1 (/ entnam)
  (setvar "blipmode" 0)
  (setvar "pickfirst" 1)
  (setvar "osmode" 15359)
  (setvar "cmdecho" 0)
  (princ "\n★功能:判断多段线是否自交.\n")
  (princ
    "\n提示:如果所选对象中包含零长度的线段,则会出现错误。\n"
  )
  (command "undo" "be")
  (princ "\n选择对象:\n")
  (setq ss (ssget '((0 . "LWPOLYLINE,POLYLINE"))))
  (if (not ss)
    (exit)
  )
  (setq num (sslength ss))
  (setvar "osmode" 0)
  (setq        i 0
        j 0
  )
  (command "LAYER" "M" "自相交层" "C" "1" "自相交层" "")
  (vl-load-com)
  (repeat num
    (setq entnam (ssname ss i))
    (setq obj (vlax-ename->vla-object entnam))
    (setq len (vlax-curve-getdistatparam
                obj
                (vlax-curve-getendparam obj)
              )
    )
    (vla-offset obj 1e-5)
    (setq obj1 (entlast))
    (vla-offset obj1 -1e-5) ;执行到这里出现问题,应该是偏移后出现的对象不止一个,所以无法判断而导致的
    (setq obj2 (entlast))
    (setq lenlast (vlax-curve-getdistatparam
                    obj2
                    (vlax-curve-getendparam obj2)
                  )
    )
    (entdel obj1)
    (entdel obj2)
    (if        (/= len lenlast)
      (progn
        (vla-put-Layer obj "自相交层")
        (setq j (1+ j))
      )
    )
    (setq i (1+ i))
  )
  (command "undo" "e")
  (if (> j 0)
    (alert
      (strcat
        "★提示:\n有"
        (itoa j)
        "个对象自相交,已将其置于“自相交层”\n"
      )
    )
    (alert "选取的多段线中无自相交对象!")
  )
  (setvar "osmode" 15359)
  (princ "\n")
)
;;;******找自相交对象 程序结束******

点评

vla-offset会因为对象的大小不同而最小有效偏移距离不一样,这一点跟直接在命令行进行OFFSET好象有点不太一样,这是比较郁闷的  发表于 2014-6-25 22:50
回复

使用道具 举报

发表于 2014-6-25 04:25:56 | 显示全部楼层
思路:复制→打散→选择集ss→逐个求交点加入Ptn→删除ss→返回Ptn
回复

使用道具 举报

发表于 2014-6-25 22:53:37 | 显示全部楼层
logoin 发表于 2014-6-23 22:55
这个要写出来容易,要高效率就难了,楼主CAD是什么版本,有空给你写一个基于计算几何算法的.net程序,在上万 ...

我也想学这个的几何算法,个人认为虽然可以借助Cad命令或者vla方法简单的解决一些问题,但很多时候就是这样,简单不一定高效
回复

使用道具 举报

 楼主| 发表于 2014-7-8 20:53:49 | 显示全部楼层
edata 发表于 2014-6-21 12:13
9楼说得极是。。。。

像这种自交线,偏移后出来几条线,而不自交的线,偏移后只出来一条,如果要一下删除偏移后的一条或多条,用lisp怎么处理呢?
回复

使用道具 举报

发表于 2015-8-24 09:35:54 | 显示全部楼层
新人学习中
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-28 12:29 , Processed in 0.179278 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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