lysygyy 发表于 2015-9-29 16:07:56

我用C++写过圆弧转换多段线的代码,用递归法将圆弧依次分为2段、4段、6段,依次加2,直到得到的多段线的面积与圆弧的面积相差小于0.001为止;出来的效果还不错,就是效率低了点儿

lysygyy 发表于 2015-9-29 16:09:02

看到楼主用lisp写的,拜服了

重慶崽兒 发表于 2015-9-29 18:34:38

culiang10086 发表于 2015-9-29 13:30 static/image/common/back.gif
程序只能从弧的右侧到左侧吗

应该说是逆时针
不过你也可以改成顺时针的,但感觉没必要

edata 发表于 2015-9-29 19:55:17

culiang10086 发表于 2015-9-29 13:30 static/image/common/back.gif
程序只能从弧的右侧到左侧吗

顺时针
;圆弧转PL线弦长定距版
;code by edata @mjtd.com 2015-9-28 22:14:47
(defun c:tt(/ ss en ds lst x)
(if(and (setq ss(ssget '((0 . "arc"))))
          (setq ds(getreal "\n输入等分弦长间距:")))
    (while(setq en(ssname ss 0))
      (setq lst(sk_div_pts en ds))
      (and lst
         (entmake (append (list '(0 . "LWPOLYLINE")
                                  '(100 . "AcDbEntity")
                                  '(100 . "AcDbPolyline")
                                  (cons 90 (length lst))
                            )
                            (mapcar '(lambda (x) (cons 10 x)) lst)
                  )
         )
      )
      (setq ss(ssdel en ss))
      )
    )
(princ)
)
;;arc定距弦长等分函数
(defun sk_div_pts(en ds / obj arc_len lst i reptime cen pt rad xian_len)
(if en
    (progn
      (setq obj(vlax-ename->vla-object en)
            arc_len(vla-get-arclength obj)
            xian_len(distance (vlax-curve-getStartPoint obj)(vlax-curve-getEndPoint obj))            
            )
      (cond
      ((or (>= ds xian_len) (>= ds arc_len))
         (setq lst(list(vlax-curve-getStartPoint obj)(vlax-curve-getEndPoint obj)))
         )
      ((< ds arc_len)
         (setq reptime (fix (/ arc_len ds)))
         (setq i -1
               pt (vlax-curve-getEndPoint obj)
               rad(vla-get-radius obj)
               cen(cdr(assoc 10 (entget en)))
               lst(list pt))
         (repeat reptime
         (setq pt(polar cen (- (angle cen pt) (sk_atan (* ds 0.5) rad)) rad))
         (setq lst(cons pt lst))
         )
         (if (not(equal (vlax-curve-getStartPoint obj) (car lst) 1e-8))
         (setq lst(cons (vlax-curve-getStartPoint obj) lst))
         )
         )
      )
      )
    )
)
;;已知弦长半径求圆心角
(defun sk_atan(a c / b)
(if(and a c)
    (progn
      (setq b(sqrt(abs(-(* c c)(* a a)))))
      (* (atan (/ (* a 1.0) b)) 2.0)
      )
    )
)

重慶崽兒 发表于 2015-9-29 20:00:37

本帖最后由 重慶崽兒 于 2015-9-29 21:53 编辑

edata 发表于 2015-9-28 22:16 static/image/common/back.gif
没细看你做的是定距弦长,修改如下。
谢谢E大   好思路啊

重慶崽兒 发表于 2015-9-29 21:50:23

lysygyy 发表于 2015-9-29 16:07 static/image/common/back.gif
我用C++写过圆弧转换多段线的代码,用递归法将圆弧依次分为2段、4段、6段,依次加2,直到得到的多段线的面积 ...

额,你是定数等分吧,我也写过,但我这边用不到,要是和多段线面积差不多的话,估计点很密吧,好思路,要是能发个lisp版的话就好了,C++看不懂,呵呵,感谢回复

海盗曹 发表于 2015-9-30 08:48:41

功能不错,看看源码

易云网络 发表于 2015-9-30 08:54:32

edata 发表于 2015-9-29 19:55 static/image/common/back.gif
顺时针

(* (atan (/ (* a 1.0) b)) 2.0)
E大你这行当当中有几个地方不是很明白
1. (* a 1.0) 是为了取小数位吗?
2. (* * 2.0) 是为什么呀。我测试出来用半径带入函数返回的是两倍的弧值,

edata 发表于 2015-9-30 10:51:41

易云网络 发表于 2015-9-30 08:54 static/image/common/back.gif
(* (atan (/ (* a 1.0) b)) 2.0)
E大你这行当当中有几个地方不是很明白
1. (* a 1.0) 是为了取小数位吗 ...

1,是取小数的意思,有点多余。b是计算出来的,应该是小数。
2,我是用的弦长的一半值计算的角度,弦长的中点,与弦长起点,圆心构成直角三角形。勾股定理求b值,再求的atan值,得到的是弦长中点的角度,*2则等于弦长的圆心角。

czcxxx 发表于 2015-9-30 12:45:07

感谢 重庆崽儿 分享程序!!!
页: 1 [2] 3
查看完整版本: 用插密多段线替换圆弧