明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1137|回复: 11

[源码] 过2点与多段线的交点

[复制链接]
发表于 2022-2-10 15:46 | 显示全部楼层 |阅读模式
本帖最后由 自贡黄明儒 于 2022-2-11 11:53 编辑

经过2点如果有构造线,求其与多段线的交点,因为两个实体都存在,用vla-IntersectWith就可以求得交点。
我碰到多次了,只知道2点,但经过2点的构造线XLINE不存在,我只好产生一条构造线XLINE来求交点,完成任务后删除这条构造线XLINE。于是产生了一个想法,是不是仅通过计算就能得到交点呢。
这种想法很久了,今天才完成,以支持明经恢复,欢迎大家测试.
  1. ;;1 [功能]两点是否与多段线有交点,延长两点来判断

  2. ;;;定义三点的行列式,即三点之倍面积
  3. ;;注p1 p2 p3 逆时针为正。
  4. (defun det (p1 p2 p3 / x2 y2)
  5.   (setq        x2 (car p2)
  6.         y2 (cadr p2)
  7.   )
  8.   (- (* (- x2 (car p3)) (- y2 (cadr p1)))
  9.      (* (- x2 (car p1)) (- y2 (cadr p3)))
  10.   )
  11. )
  12. ;;[功能] 4点求交点(仿vla-IntersectWith)
  13. ;;acextendnone 0 不延伸
  14. ;;acextendthisentity 1 延伸基准点
  15. ;;acextendotherentity 2
  16. ;;acextendboth 3
  17. (defun My:4pInters (p1 p2 p3 p4 Flag)
  18.   (cond        ((= Flag 0) (inters p1 p2 p3 p4 T))
  19.         ((= Flag 1)
  20.          (if (= (minusp (det p1 p2 p3)) (minusp (det p1 p2 p4)))
  21.            (inters p1 p2 p3 p4 T)
  22.            (inters p1 p2 p3 p4 nil)
  23.          )
  24.         )
  25.         ((= Flag 2)
  26.          (if (= (minusp (det p3 p4 p1)) (minusp (det p3 p4 p2)))
  27.            (inters p1 p2 p3 p4 T)
  28.            (inters p1 p2 p3 p4 nil)
  29.          )
  30.         )
  31.         ((= Flag 3) (inters p1 p2 p3 p4 nil))
  32.   )
  33. )

  34. ;;2 [功能]两点与弧是否有交点

  35. ;;2点与圆的交点 By Highflybird
  36. (defun IntersLineCircle        (p1 p2 cp r / p0 d n s)
  37.   (setq        n  (mapcar '- p2 p1) ;_ 新投影面的法向量
  38.         P1 (trans p1 0 n) ;_ P1坐标转换到新投影面n
  39.         cp (trans cp 0 n) ;_ CP坐标转换到新投影面n
  40.         p0 (list (car p1) (cadr p1) (caddr cp)) ;_ P0在新投影面坐标
  41.   )
  42.   (cond
  43.     ((equal r (setq d (distance cp p0)) 1e-7) ;_ 直线和园相切,考虑计算误差
  44.      (list (trans p0 n 0))
  45.     )
  46.     ((< d r) ;_ 相交
  47.      (setq s (sqrt (- (* r r) (* d d))))
  48.      (list
  49.        (trans (list (car p1) (cadr p1) (- (caddr cp) s)) n 0) ;_ J1坐标
  50.        (trans (list (car p1) (cadr p1) (+ (caddr cp) s)) n 0) ;_ J2坐标
  51.      )
  52.     )
  53.   )
  54. )
  55. ;;2点与弧的交点'((-406.036 286.692 0.0) (416.036 286.692 0.0))
  56. ;;(setq L '((5033.03 7264.11 0.0) (5652.18 6834.35 0.0)))
  57. (defun My:2pArcInters (e p1 p2 cp r / L x)
  58.   (setq L (IntersLineCircle p1 p2 cp r))
  59.   (if L
  60.     (setq L (mapcar '(lambda (x)
  61.                        (if (equal (vlax-curve-getclosestpointto e x) x 1e-2)
  62.                          x
  63.                        )
  64.                      )
  65.                     L
  66.             )
  67.     )
  68.   )
  69.   (vl-remove 'nil L)
  70. )

  71. ;;3 [功能] 2点与多段线交点
  72. ;;'((5033.03 7264.11 0.0) (5608.24 6864.85)),三维点表示2点延长线与弧的交点,二维点表示与直线延长交点
  73. (defun 2PLwpolylineInters (e p3 p4 / A CP EN I L P1 P2 PP R SR Flag)  
  74.   setq en (entget e))  (setq Flag (= (cdr (assoc 70 en))1));T,表示闭合
  75.   (setq        en (vl-remove-if-not
  76.              '(lambda (x)
  77.                 (or (= (car x) 42) (= (car x) 10))
  78.               )
  79.              en
  80.            )
  81.   )
  82.   (if Flag
  83.     (setq en (append en (List (car en))))
  84.   )
  85.   (setq i -1)
  86.   (while (setq i  (1+ i)
  87.                p1 (cdar en)
  88.                en (cdr en)
  89.                sr (cdar en)
  90.                en (cdr en)
  91.                p2 (cdar en)
  92.          )
  93.     (if        (equal sr 0)
  94.       (if (setq a (My:4pInters p1 p2 p3 p4 2))
  95.         (setq L (append L (list a)))
  96.       )
  97.       (progn
  98.         (setq pp (vlax-curve-getPointAtParam e (+ i 0.5)))
  99.         (if (minusp (car (trans (mapcar '- pp p2) 0 (mapcar '- p1 p2))))
  100.           (setq cp (mapcar '- pp (vlax-curve-getsecondderiv e (+ i 0.5))))
  101.           (setq cp (mapcar '+ pp (vlax-curve-getsecondderiv e (+ i 0.5))))
  102.         )
  103.         (setq r (distance p1 cp))
  104.         (setq L (append L (My:2pArcInters e p3 p4 cp r)))
  105.       )
  106.     )
  107.   )
  108.   L
  109. )

  110. ;;测试
  111. (defun C:a1 (/ E P3 P4)
  112.   (setq e (car (entsel)))                                    ;选择一个多段线
  113.   (setq p3(getpoint) p4(getpoint));选择两点
  114.   (2PLwpolylineInters e p3 p4)
  115. )
  116. ;;(command "line" x)

评分

参与人数 1明经币 +1 收起 理由
Bao_lai + 1 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2022-4-5 13:42 | 显示全部楼层
ddbegg 发表于 2022-4-5 10:43
大师有没有办法把两个方向的交点分开?也就是说能不能求出只延伸一个方向的交点(另一个方向不延伸)


本帖子中包含更多资源

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

x
发表于 2022-12-5 06:58 | 显示全部楼层
最近刚好也有相同的需求,多谢黄大师共享代码。
主要是有点疑问:
在实际应用中,究竟是这种纯计算的方法效率更高,还是使用生成辅助线再删除的效率更高呢?
发表于 2022-2-11 21:17 | 显示全部楼层
本帖最后由 wzg356 于 2022-2-11 21:18 编辑

数学几何计算对计算机是小儿科,主要是过程中的表处理/循环带来的效率折减

从过程及效果上讲还是用你最初的土办法“两对象交点”更好
发表于 2022-2-10 16:20 | 显示全部楼层
黄大师好久不见,感谢分享。
发表于 2022-2-10 16:32 | 显示全部楼层
感谢大佬分享新作
发表于 2022-2-10 19:09 | 显示全部楼层
非常感谢分享
发表于 2022-2-11 12:47 | 显示全部楼层
黄大师好久不见,感谢分享。
发表于 2022-4-5 10:43 | 显示全部楼层
大师有没有办法把两个方向的交点分开?也就是说能不能求出只延伸一个方向的交点(另一个方向不延伸)
发表于 2022-4-5 15:14 | 显示全部楼层
发表于 2022-4-5 16:08 | 显示全部楼层
非常感谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-25 14:40 , Processed in 3.115162 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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