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
感谢 重庆崽儿 分享程序!!!