求求 , 怎么获取圆角矩形中的4个圆角的中点坐标啊
1.获取图元2.遍历顶点
3.将相邻顶点间距最小的添加进圆弧列表(怎么在循环中把坐标加入列表啊 ,用setq好像会覆盖)
4.遍历对比相邻顶点的xy,判断圆角开口方向
5.将相邻点xy求差值,得出半径,根据半径得出弧长,然后..然后就意识到数学的重要性了..还是不知道咋求
是这样求吗..或者应该用其他的办法实现
as6424 发表于 2024-2-4 14:47
谢谢老师 , 那我先去试试遍历判断圆弧和判断圆弧开口方向 , 那个 , 我不会将循环中提取的元素添加进指定 ...
其中一种方式,仅供参考
(defun c:tt (/ e p1 p2 p3 p4)
(if (setq e (car (entsel)))
(mapcar '(lambda(x)(vlax-curve-getClosestPointTo e x))
(progn
(vla-GetBoundingBox (vlax-ename->vla-object e) 'p1 'p3)
(setq p1 (vlax-safearray->list p1)
p3 (vlax-safearray->list p3)
p2 (list (car p3)(cadr p1) 0.0)
p4 (list (car p1)(cadr p3) 0.0)
)
(list p1 p2 p3 p4)
)
)
)
) 炸开法
(defun c:tt(/ obj)
(setq obj (vlax-ename->vla-object (car (entsel))))
(foreach obj(vlax-safearray->list
(vlax-variant-value (vla-explode obj)))
(if (= "AcDbArc" (vla-get-ObjectName obj))
(entmake
(list
'(0 . "point")
(cons 10
(vlax-curve-getpointatparam
obj
(* 0.5
(+ (vlax-curve-getstartparam
obj)
(vlax-curve-getendparam
obj))))))))
(vla-delete obj))) 这个稍微通用一点
(defun c:tt(/ en i pt1 pt2 pt3 u v)
(setq en (car (entsel))
i(vlax-curve-getendparam en))
(repeat (fix i)
(setq pt1 (vlax-curve-getpointatparam en i)
pt2 (vlax-curve-getpointatparam en (1- i)))
(setq pt3 (vlax-curve-getpointatparam
en
(+ (setq i (1- i)) 0.5))
u (mapcar '- pt1 pt3)
v (mapcar '- pt2 pt3))
(if (not (equal '(0. 0. 0.)
(list (- (* (cadr u) (caddr v))
(* (cadr v) (caddr u)))
(- (* (car v) (caddr u))
(* (car u) (caddr v)))
(- (* (car u) (cadr v))
(* (car v) (cadr u))))
1e-6))
(entmake (list '(0 . "point") (cons 10 pt3)))))) 包围盒顶点到曲线的最近点 bonny 发表于 2024-2-4 14:21
包围盒顶点到曲线的最近点
谢谢老师 , 那我先去试试遍历判断圆弧和判断圆弧开口方向 , 那个 , 我不会将循环中提取的元素添加进指定列表 , 是只能用cons吗 , 不能用下标指定赋值吗 遍历polyline的时候有凸度,从而判断是弧段,也可以根据正负数判断开口方向,接着自己算也好,用曲线求长度也行 bonny 发表于 2024-2-4 14:54
其中一种方式,仅供参考
谢谢老师 , 我去学习下lambda和mapcar 你有种再说一遍 发表于 2024-2-4 14:53
遍历polyline的时候有凸度,从而判断是弧段,也可以根据正负数判断开口方向,接着自己算也好,用曲线求长度也行
谢谢老师提供思路 , 不过目前甚至不理解凸度.. x_s_s_1 发表于 2024-2-5 11:20
这个稍微通用一点
我消化一下, 谢谢老师 复制炸开求圆心最直接
页:
[1]
2