晨曦CAD 发表于 2023-1-4 13:03:20

如何计算曲线交点?

给定输入一个曲线图元curve(*LINE,ARC均可)和两个点pp1、pp2,

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

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

liuhe 发表于 2023-1-4 14:20:08

http://bbs.mjtd.com/forum.php?mo ... hlight=%BD%BB%B5%E3    大哥,有专门的函数求交点Intersectwith

晨曦CAD 发表于 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 循环求交点

wzg356 发表于 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 这个也可以取得交点 也是精度上也有问题

20060510412 发表于 2023-1-6 08:42:57

该用辅助线的时候,就得用辅助线。

纯算法的效率,有可能还不如使用辅助线。

xyp1964 发表于 2023-1-7 15:16:57

本帖最后由 xyp1964 于 2023-1-7 15:18 编辑


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

magicheno 发表于 2023-1-12 21:46:32

xyp1964 发表于 2023-1-7 15:16


感谢院长分享~
页: [1]
查看完整版本: 如何计算曲线交点?