明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6973|回复: 37

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

[复制链接]
发表于 2014-6-20 22:00 | 显示全部楼层 |阅读模式
2明经币
要求如下,请高手给出思路。


附件: 您需要 登录 才可以下载或查看,没有账号?注册
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2014-6-20 22:00 | 显示全部楼层
  1. (defun GetPts (Lst)
  2.   (if (caddr Lst)
  3.     (cons
  4.       (list (car Lst) (cadr Lst) (caddr Lst))
  5.       (GetPts (cdddr Lst))
  6.     )
  7.   )
  8. )
  9. (defun intersectPts (vlaobj1 vlaobj2 / ptsVar ptsArray ptsList)
  10.   (setq        ptsVar         (vla-intersectwith vlaobj1 vlaobj2 acExtendNone)
  11.         ptsArray (vlax-variant-value ptsVar)
  12.         ptsList         (vl-catch-all-apply 'vlax-safeArray->list (list ptsArray))
  13.   )
  14.   (if (vl-catch-all-error-p ptsList)
  15.     nil
  16.     (GetPts ptsList)
  17.   )
  18. )
  19. (defun RemoveParam (EndPrm Pline / SomPrm)
  20.   (cond        ((= EndPrm 0) nil)
  21.         ((= (setq SomPrm (vlax-curve-GetParamAtPoint
  22.                            Pline
  23.                            (vlax-curve-GetPointAtParam Pline EndPrm)
  24.                          )
  25.             )
  26.             EndPrm
  27.          )
  28.          (RemoveParam (1- EndPrm) Pline)
  29.         )
  30.         ((/= SomPrm EndPrm)
  31.          (cons SomPrm (RemoveParam (1- EndPrm) Pline))
  32.         )
  33.   )
  34. )
  35. (defun GetAllSelfInters        (Ename / VlaObj PrmLst)
  36.   (setq VlaObj (vlax-ename->vla-object Ename))
  37.   (setq
  38.     PrmLst (append
  39.              (vl-remove-if
  40.                (function (lambda (x) (= (fix x) x)))
  41.                (mapcar
  42.                  (function
  43.                    (lambda (x) (vlax-curve-GetParamAtPoint VlaObj x))
  44.                  )
  45.                  (intersectPts VlaObj VlaObj)
  46.                )
  47.              )
  48.              (RemoveParam (vlax-curve-GetEndParam VlaObj) VlaObj)
  49.            )
  50.   )
  51.   (mapcar (function (lambda (x) (vlax-curve-GetPointAtParam VlaObj x))
  52.           )
  53.           (vl-sort PrmLst '<)
  54.   )
  55. )
回复

使用道具 举报

发表于 2014-6-21 00:28 | 显示全部楼层
逐段计算与其不相邻的线段交点!
回复

使用道具 举报

发表于 2014-6-21 08:06 | 显示全部楼层
nzl1116,看看下面的图,仍有自交点,其实没有

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2014-6-21 08:15 | 显示全部楼层
不懂~~~~纯支持
回复

使用道具 举报

发表于 2014-6-21 08:18 | 显示全部楼层
nzl1116 发表于 2014-6-21 02:18

我在http://bbs.mjtd.com/thread-108149-1-1.html收录有st788796的作品,据一个网友说有问题。今天试了一下,如下图,确实有问题。
你的程序也同样有这个问题
你们两大高手如果不能解决,其他也解决不了啦。
其他高手比你们的更粗糙。

点评

老黄论如何科学地卖广告(开玩笑) 看了四十多行…  发表于 2014-6-21 12:39
回复

使用道具 举报

发表于 2014-6-21 09:02 | 显示全部楼层
自贡黄明儒 发表于 2014-6-21 08:18
我在http://bbs.mjtd.com/thread-108149-1-1.html收录有st788796的作品,据一个网友说有问题。今天试了一 ...

是不是点重合不算自交?
回复

使用道具 举报

发表于 2014-6-21 09:06 | 显示全部楼层
nzl1116 发表于 2014-6-21 09:02
是不是点重合不算自交?

这个命题倒是有点困难哈
对于一般绘图而言,只要是肉眼看不到有交点,应该就不算自交。
回复

使用道具 举报

发表于 2014-6-21 09:23 | 显示全部楼层
自贡黄明儒 发表于 2014-6-21 09:06
这个命题倒是有点困难哈
对于一般绘图而言,只要是肉眼看不到有交点,应该就不算自交。

其实象楼主的"8"字型也有两种情况,一种是交叉部分"X"型,另外一种是两个"V"字型,如果点重合不算自交,那两个"V"字型应该也不算。这样的话,倒是增加了困难。
回复

使用道具 举报

发表于 2014-6-21 09:42 | 显示全部楼层
随便说说:凡是面域后创建0个面域不是有自交就是有重叠,对于开口的可用先使其闭合再面域……
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-30 16:21 , Processed in 0.248593 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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