明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 荒野孤行

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

[复制链接]
发表于 2014-6-21 12:13 | 显示全部楼层
9楼说得极是。。。。

本帖子中包含更多资源

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

x

点评

这样的话就简单了,把我的函数得到的结果,只要判断第一个点是不是起点就行了  发表于 2014-6-21 13:22
两个V应该算自交吧?!肉眼明显可见  发表于 2014-6-21 12:32
回复

使用道具 举报

 楼主| 发表于 2014-6-21 12:45 | 显示全部楼层
nzl1116 发表于 2014-6-21 09:23
其实象楼主的"8"字型也有两种情况,一种是交叉部分"X"型,另外一种是两个"V"字型,如果点重合不算自交,那 ...

如果多段线自交点那里是圆弧呢?

点评

包括圆弧的  发表于 2014-6-21 13:24
回复

使用道具 举报

发表于 2014-6-21 12:57 | 显示全部楼层
如果是圆弧的话,估计得先用凸度算出弧arc,再计算交点。
回复

使用道具 举报

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

本来是算的,后面看到9楼所言,改的。
如果两V算交点,是算一个还是算两个,目前是两个。
回复

使用道具 举报

发表于 2014-6-21 14:26 | 显示全部楼层
本帖最后由 nzl1116 于 2014-6-21 14:58 编辑

获取外观交点,如果存在节点交叉共线的,要先移除多余的节点。
  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 Pline (vlax-curve-GetPointAtParam Pline EndPrm))) EndPrm)
  22.          (RemoveParam (1- EndPrm) Pline)
  23.         )
  24.         ((/= SomPrm EndPrm)
  25.          (cons SomPrm (RemoveParam (1- EndPrm) Pline))
  26.         )
  27.   )
  28. )
  29. (defun GetSelfInters (Ename / VlaObj PrmLst EndPrm)
  30.   (setq VlaObj (vlax-ename->vla-object Ename))
  31.   (setq EndPrm (vlax-curve-GetEndParam VlaObj))
  32.   (if (= (vlax-curve-GetParamAtPoint VlaObj (vlax-curve-GetPointAtParam VlaObj EndPrm)) 0)
  33.     (setq EndPrm (1- EndPrm))
  34.   )
  35.   (setq PrmLst (append
  36.                  (vl-remove-if
  37.                    (function (lambda (x) (= (fix x) x)))
  38.                    (mapcar
  39.                      (function
  40.                        (lambda (y)
  41.                          (vlax-curve-GetParamAtPoint VlaObj y)
  42.                        )
  43.                      )
  44.                      (intersectPts VlaObj VlaObj)
  45.                    )
  46.                  )
  47.                  (mapcar 'fix (RemoveParam EndPrm VlaObj))
  48.                )
  49.   )
  50.   (mapcar (function (lambda (x) (vlax-curve-GetPointAtParam VlaObj x)))
  51.           (vl-sort PrmLst '<)
  52.   )
  53. )

评分

参与人数 1明经币 +1 收起 理由
自贡黄明儒 + 1 很给力!交点还须除重

查看全部评分

回复

使用道具 举报

发表于 2014-6-21 14:28 | 显示全部楼层

本帖子中包含更多资源

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

x
回复

使用道具 举报

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

黄师傅,您怎么看?
回复

使用道具 举报

发表于 2014-6-21 21:24 | 显示全部楼层
回复

使用道具 举报

发表于 2014-6-23 10:59 | 显示全部楼层
个人认为,如果只用那个多线段可以做出面域的数量多于(rem(cdr(assoc 70(entget e)))2)就应该是自相交的,也就是说不闭合多线段有一个及以上封闭区域或者闭合多线段有两个及以上闭合区域,那么这条多线段自相交
回复

使用道具 举报

发表于 2014-6-23 12:15 | 显示全部楼层
llsheng_73 发表于 2014-6-23 10:59
个人认为,如果只用那个多线段可以做出面域的数量多于(rem(cdr(assoc 70(entget e)))2)就应该是自相交的,也 ...

判断多段线是否自交:
(if (> (length (setq l (vlax-invoke obj 'offset 1e-6))) 1)
   (princ "\n自交")
  (princ "\n不自交")
)
(mapcar 'vla-delete l)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-17 22:01 , Processed in 0.265858 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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