明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1021|回复: 8

[提问] 如何计算曲线交点?

[复制链接]
发表于 2023-1-4 13:03:20 | 显示全部楼层 |阅读模式
给定输入一个曲线图元curve(*LINE,ARC均可)和两个点pp1、pp2,

假设过两点的线段与曲线有交点,大佬有没有什么好的办法计算出交点?

附一个我现有的方案:
弊端:需要创建一个LINE图元
  1. (defun lineinsect(curve pp1 pp2 / obj1 obj2 objen intp xintp closedpoint)
  2.     ;closedpoint返回计算在点列表pbll中距离点pa最近的点
  3.     (defun closedpoint(pa pbll / padistlst cx)
  4.       (setq padistlst(mapcar'(lambda(cx)(distance pa cx))pbll))
  5.       (nth (car(HG::LIST::INDEX (HG::LIST::MIN padistlst)padistlst)) pbll)
  6.       )
  7.       
  8.     (setq obj1(vlax-ename->vla-object curve))
  9.     ;创建pp1、pp2为起点终点的LINE
  10.     (setq objen(HG::ACT::PUT_ENAME "LINE" (LIST (trans2wcs pp1) (trans2wcs pp2))))
  11.     (setq obj2(vlax-ename->vla-object objen))
  12.     (setq intp(vla-intersectwith obj1 obj2 acExtendNone))
  13.     (ENTDEL objen)
  14.     (setq xintp(vlax-safearray->list (vlax-variant-value intp)))
  15.     (if(> (length xintp)3)
  16.       (trans2ucs(closedpoint pp1 (HG::LIST::DIVIDE3 xintp)));辅助函数HG::LIST::DIVIDE3将列表三三分割
  17.       (trans2ucs xintp);辅助函数trans2ucs将点转化为UCS坐标系
  18.     )
  19.   )


发表于 2023-1-4 14:20:08 | 显示全部楼层
http://bbs.mjtd.com/forum.php?mo ... hlight=%BD%BB%B5%E3    大哥,有专门的函数求交点Intersectwith
 楼主| 发表于 2023-1-4 16:29:06 | 显示全部楼层
liuhe 发表于 2023-1-4 14:20
http://bbs.mjtd.com/forum.php?mo ... hlight=%BD%BB%B5%E3    大哥,有专门的函数求交点Intersectwith

我给的代码例子是用Intersectwith的,有没有不用Intersectwith的方法,因为只有一条曲线图元,不能直接满足Intersectwith的输入参数要求
发表于 2023-1-4 17:24:57 | 显示全部楼层
获取 曲线图元 点表 用inters 循环求交点
发表于 2023-1-4 17:36:37 来自手机 | 显示全部楼层
飞雪神光 发表于 2023-1-4 17:24
获取 曲线图元 点表 用inters 循环求交点

真曲线如圆弧是不行的
发表于 2023-1-4 18:23:57 | 显示全部楼层
wzg356 发表于 2023-1-4 17:36
真曲线如圆弧是不行的

根据精度需求等分曲线 但是速度会慢 还有ssnamex 这个也可以取得交点 也是精度上也有问题
发表于 2023-1-6 08:42:57 | 显示全部楼层
该用辅助线的时候,就得用辅助线。

纯算法的效率,有可能还不如使用辅助线。
发表于 2023-1-7 15:16:57 | 显示全部楼层
本帖最后由 xyp1964 于 2023-1-7 15:18 编辑

  1. ;; (lineinsect (setq s0(car(entsel"\n选择: "))) (setq p0 (getpoint  "\n基点<退出>: ")) (setq p1 (getpoint p0 "\n基点<退出>: ")))
  2. (defun lineinsect (curve p1 p2 / LST S1)   
  3.   (defun ListDiv (lst nn / a tmp)
  4.     ;; (ListDiv '(1 2 3 4 5 6 7 8 9 ) 3)
  5.     (while (>= (length lst) nn)
  6.       (setq tmp '())
  7.       (repeat nn (setq tmp (cons (car lst) tmp) lst (cdr lst)))
  8.       (setq a (cons (reverse tmp) a))
  9.     )
  10.     (if lst (setq a (cons lst a)))
  11.     (reverse a)
  12.   )
  13.   (command "line" "non" p1 "non" p2 "")
  14.   (setq lst (vlax-invoke(vlax-ename->vla-object curve)'intersectwith(vlax-ename->vla-object (setq s1 (entlast)))0))
  15.   (ENTDEL s1)
  16.   (ListDiv lst 3)
  17. )

发表于 2023-1-12 21:46:32 | 显示全部楼层

感谢院长分享~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-16 07:55 , Processed in 0.186525 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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