如何计算曲线交点?
给定输入一个曲线图元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坐标系
)
)
http://bbs.mjtd.com/forum.php?mo ... hlight=%BD%BB%B5%E3 大哥,有专门的函数求交点Intersectwith liuhe 发表于 2023-1-4 14:20
http://bbs.mjtd.com/forum.php?mo ... hlight=%BD%BB%B5%E3 大哥,有专门的函数求交点Intersectwith
我给的代码例子是用Intersectwith的,有没有不用Intersectwith的方法,因为只有一条曲线图元,不能直接满足Intersectwith的输入参数要求 获取 曲线图元 点表 用inters 循环求交点 飞雪神光 发表于 2023-1-4 17:24
获取 曲线图元 点表 用inters 循环求交点
真曲线如圆弧是不行的 wzg356 发表于 2023-1-4 17:36
真曲线如圆弧是不行的
根据精度需求等分曲线 但是速度会慢 还有ssnamex 这个也可以取得交点 也是精度上也有问题 该用辅助线的时候,就得用辅助线。
纯算法的效率,有可能还不如使用辅助线。 本帖最后由 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)
)
xyp1964 发表于 2023-1-7 15:16
感谢院长分享~
页:
[1]