as6424 发表于 2024-2-4 14:15:23

求求 , 怎么获取圆角矩形中的4个圆角的中点坐标啊

1.获取图元
2.遍历顶点
3.将相邻顶点间距最小的添加进圆弧列表(怎么在循环中把坐标加入列表啊 ,用setq好像会覆盖)
4.遍历对比相邻顶点的xy,判断圆角开口方向
5.将相邻点xy求差值,得出半径,根据半径得出弧长,然后..然后就意识到数学的重要性了..还是不知道咋求

是这样求吗..或者应该用其他的办法实现

bonny 发表于 2024-2-4 14:54:02

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)
                        )
                )
        )
)

x_s_s_1 发表于 2024-2-7 09:01:25

炸开法
(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)))

x_s_s_1 发表于 2024-2-5 11:20:33

这个稍微通用一点
(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:35

包围盒顶点到曲线的最近点

as6424 发表于 2024-2-4 14:47:28

bonny 发表于 2024-2-4 14:21
包围盒顶点到曲线的最近点

谢谢老师 , 那我先去试试遍历判断圆弧和判断圆弧开口方向 , 那个 , 我不会将循环中提取的元素添加进指定列表 , 是只能用cons吗 , 不能用下标指定赋值吗

你有种再说一遍 发表于 2024-2-4 14:53:57

遍历polyline的时候有凸度,从而判断是弧段,也可以根据正负数判断开口方向,接着自己算也好,用曲线求长度也行

as6424 发表于 2024-2-5 09:44:18

bonny 发表于 2024-2-4 14:54
其中一种方式,仅供参考

谢谢老师 , 我去学习下lambda和mapcar

as6424 发表于 2024-2-5 09:47:35

你有种再说一遍 发表于 2024-2-4 14:53
遍历polyline的时候有凸度,从而判断是弧段,也可以根据正负数判断开口方向,接着自己算也好,用曲线求长度也行

谢谢老师提供思路 , 不过目前甚至不理解凸度..

as6424 发表于 2024-2-5 13:27:36

x_s_s_1 发表于 2024-2-5 11:20
这个稍微通用一点

我消化一下, 谢谢老师

xyp1964 发表于 2024-2-5 13:54:19

复制炸开求圆心最直接
页: [1] 2
查看完整版本: 求求 , 怎么获取圆角矩形中的4个圆角的中点坐标啊