明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 重慶崽兒

[源码] 用插密多段线替换圆弧

  [复制链接]
发表于 2015-9-29 16:07 | 显示全部楼层
我用C++写过圆弧转换多段线的代码,用递归法将圆弧依次分为2段、4段、6段,依次加2,直到得到的多段线的面积与圆弧的面积相差小于0.001为止;出来的效果还不错,就是效率低了点儿
发表于 2015-9-29 16:09 | 显示全部楼层
看到楼主用lisp写的,拜服了
 楼主| 发表于 2015-9-29 18:34 | 显示全部楼层
culiang10086 发表于 2015-9-29 13:30
程序只能从弧的右侧到左侧吗

应该说是逆时针
不过你也可以改成顺时针的,但感觉没必要
发表于 2015-9-29 19:55 | 显示全部楼层
culiang10086 发表于 2015-9-29 13:30
程序只能从弧的右侧到左侧吗

顺时针
  1. ;圆弧转PL线弦长定距版
  2. ;code by edata @mjtd.com 2015-9-28 22:14:47
  3. (defun c:tt(/ ss en ds lst x)
  4.   (if(and (setq ss(ssget '((0 . "arc"))))
  5.           (setq ds(getreal "\n输入等分弦长间距:")))
  6.     (while(setq en(ssname ss 0))
  7.       (setq lst(sk_div_pts en ds))
  8.       (and lst
  9.            (entmake (append (list '(0 . "LWPOLYLINE")
  10.                                   '(100 . "AcDbEntity")
  11.                                   '(100 . "AcDbPolyline")
  12.                                   (cons 90 (length lst))
  13.                             )
  14.                             (mapcar '(lambda (x) (cons 10 x)) lst)
  15.                     )
  16.            )
  17.       )
  18.       (setq ss(ssdel en ss))
  19.       )
  20.     )
  21.   (princ)
  22.   )
  23. ;;arc定距弦长等分函数
  24. (defun sk_div_pts(en ds / obj arc_len lst i reptime cen pt rad xian_len)
  25.   (if en
  26.     (progn
  27.       (setq obj(vlax-ename->vla-object en)
  28.             arc_len(vla-get-arclength obj)
  29.             xian_len(distance (vlax-curve-getStartPoint obj)(vlax-curve-getEndPoint obj))            
  30.             )
  31.       (cond
  32.         ((or (>= ds xian_len) (>= ds arc_len))
  33.          (setq lst(list(vlax-curve-getStartPoint obj)(vlax-curve-getEndPoint obj)))
  34.          )
  35.         ((< ds arc_len)
  36.          (setq reptime (fix (/ arc_len ds)))
  37.          (setq i -1
  38.                pt (vlax-curve-getEndPoint obj)
  39.                rad(vla-get-radius obj)
  40.                cen(cdr(assoc 10 (entget en)))
  41.                lst(list pt))
  42.          (repeat reptime
  43.            (setq pt(polar cen (- (angle cen pt) (sk_atan (* ds 0.5) rad)) rad))
  44.            (setq lst(cons pt lst))
  45.            )
  46.          (if (not(equal (vlax-curve-getStartPoint obj) (car lst) 1e-8))
  47.            (setq lst(cons (vlax-curve-getStartPoint obj) lst))
  48.            )
  49.          )
  50.         )
  51.       )
  52.     )
  53.   )
  54. ;;已知弦长半径求圆心角
  55. (defun sk_atan(a c / b)
  56.   (if(and a c)
  57.     (progn
  58.       (setq b(sqrt(abs(-(* c c)(* a a)))))
  59.       (* (atan (/ (* a 1.0) b)) 2.0)
  60.       )
  61.     )
  62.   )

评分

参与人数 1明经币 +1 收起 理由
重慶崽兒 + 1 E大好心人,32个赞

查看全部评分

 楼主| 发表于 2015-9-29 20:00 | 显示全部楼层
本帖最后由 重慶崽兒 于 2015-9-29 21:53 编辑
edata 发表于 2015-9-28 22:16
没细看你做的是定距弦长,修改如下。

谢谢E大   好思路啊
 楼主| 发表于 2015-9-29 21:50 | 显示全部楼层
lysygyy 发表于 2015-9-29 16:07
我用C++写过圆弧转换多段线的代码,用递归法将圆弧依次分为2段、4段、6段,依次加2,直到得到的多段线的面积 ...

额,你是定数等分吧,我也写过,但我这边用不到,要是和多段线面积差不多的话,估计点很密吧,好思路,要是能发个lisp版的话就好了,C++看不懂,呵呵,感谢回复
发表于 2015-9-30 08:48 | 显示全部楼层
功能不错,看看源码
发表于 2015-9-30 08:54 | 显示全部楼层
edata 发表于 2015-9-29 19:55
顺时针

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

发表于 2015-9-30 10:51 | 显示全部楼层
易云网络 发表于 2015-9-30 08:54
(* (atan (/ (* a 1.0) b)) 2.0)
E大你这行当当中有几个地方不是很明白
1. (* a 1.0) 是为了取小数位吗 ...

1,是取小数的意思,有点多余。b是计算出来的,应该是小数。
2,我是用的弦长的一半值计算的角度,弦长的中点,与弦长起点,圆心构成直角三角形。勾股定理求b值,再求的atan值,得到的是弦长中点的角度,*2则等于弦长的圆心角。
发表于 2015-9-30 12:45 | 显示全部楼层
感谢 重庆崽儿 分享程序!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-3-29 21:28 , Processed in 0.273897 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表