明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 471|回复: 5

椭圆8段弧法模拟

[复制链接]
发表于 2024-7-22 11:30:50 | 显示全部楼层 |阅读模式
本帖最后由 尘缘一生 于 2024-7-22 16:23 编辑

晓东那边有这段源代码,不是可以运行的,为此改写探讨

改写代码如下:
  1. ;取得图元参数值内容-----(一级)-------
  2. ;(setq h (dxf1 ent 40))
  3. ;ent 为实体nam obj 或实体表 entget
  4. (defun dxf1 (ent i / tmp tp)
  5.   (setq tp (type ent))
  6.   (cond
  7.     ((= tp 'VLA-OBJECT)
  8.       (setq ent (entget (obj2en ent) '("*")))
  9.     )
  10.     ((= tp 'ENAME)
  11.       (setq ent (entget ent '("*")))
  12.     )
  13.   )
  14.   (setq tmp (cdr (assoc i (vl-remove-if-not '(lambda (x) (= (car x) i)) ent))))
  15.   (if (null tmp)
  16.     (cond
  17.       ((= i 66) 0)
  18.       ((= i 48) (getvar "CELTSCALE"))
  19.       ((member i '(6 62))
  20.         (cdr (assoc i (entget (tblobjname "LAYER" (cdr (assoc 8 ent)))))) ;对象所在图层颜色
  21.       )
  22.       ((= i 370) -1)
  23.       ((= i 7) $hz)
  24.     )
  25.     tmp
  26.   )
  27. )
  28. ;;点集镜像---(一级)----
  29. (defun sl-ptlst-mirror (pl p1 p2 / ang)
  30.   (setq ang (* 2 (angle p1 p2)))
  31.   (mapcar '(lambda (p) (polar p1 (- ang (angle p1 p)) (distance p1 p))) pl)
  32. )
  33. ;;点镜像---(一级)----
  34. (defun sl-pt-mirror (p p1 p2)
  35.   (setq p (polar p1 (- (* 2 (angle p1 p2)) (angle p1 p)) (distance p1 p)))
  36.   p
  37. )
  38. ;;-测试镜像点集-----------
  39. (defun c:tt1 (/ ss pl p1 p2)
  40.   (setq ss (ssget))
  41.   (setq p1 (getpoint "\n 镜像轴第一点"))
  42.   (setq p2 (getpoint p1 "\n 镜像轴第二点"))
  43.   (setq pl (getpt ss))
  44.   (setq pl (sl-ptlst-mirror pl p1 p2))
  45.   (makelwpolyline pl 0 nil)
  46.   pl
  47. )
  48. ;;椭圆8弧点位---(一级)----
  49. ;;Modify by SLdesign V3.0 尘缘一生 QQ:15290049 2024年7月20号
  50. (defun ellto8arc (nam / p0 star_seg end_seg star_node end_node p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 nod1 nod2 nod3 nod4 epl
  51.                    long_vectors length_ratio major_axis sub_axis sub_x1 sub_y1 node_radius radius_len8 radius_sho2 alpha trl1 trl2 trl3 trl trm trm1 trm2
  52.                    trn trn1 circle_xc1 circle_yc1 trk trk1 trv trv1 circle_xm1 circle_ym1 trr trw trw1 trw2 circle_xn1 circle_yn1 circle_yc2 circle_xc2
  53.                    circle_xc8 circle_yc8 ellipse_xc ellipse_yc ellipse_xc1 ellipse_yc1 ellipse_xm ellipse_ym ellipse_xm1 ellipse_ym1 ellipse_xn ellipse_yn
  54.                    ellipse_xn1 ellipse_yn1 ellipse_xc2 ellipse_yc2 ellipse_xc8 ellipse_yc8
  55.                  )
  56.   (if (= (dxf1 nam 0) "ELLIPSE")
  57.     (progn
  58.       (setq p0 (trans (dxf1 nam 10) 0 1));对圆心进行坐标变换
  59.       (setq long_vectors (dxf1 nam 11));椭圆的长轴端点矢量
  60.       (setq length_ratio (dxf1 nam 40));椭圆的长轴与短轴的比例
  61.       ;(setq ellipse_star (dxf1 nam 41));椭圆弧的起点角度
  62.       ;(setq ellipse_end (dxf1 nam 42));椭圆弧的终点角度
  63.       (setq major_axis (sqrt (+ (expt (car long_vectors) 2) (expt (cadr long_vectors) 2))));长半轴的长度
  64.       (setq sub_axis (* major_axis length_ratio));短半轴的长度
  65.       (setq sub_x1 (* (cadr long_vectors) length_ratio -1));短轴矢量的X轴分量
  66.       (setq sub_y1 (* (car long_vectors) length_ratio));短轴矢量的Y轴分量
  67.       (setq nod1 (list (+ (car p0) (car long_vectors)) (+ (cadr p0) (cadr long_vectors)) 0.0));从椭圆长轴起点开始逆时针确定四个端点
  68.       (setq nod2 (list (+ (car p0) sub_x1) (+ (cadr p0) sub_y1) 0.0))
  69.       (setq nod3 (list (- (car p0) (car long_vectors)) (- (cadr p0) (cadr long_vectors)) 0.0))
  70.       (setq nod4 (list (- (car p0) sub_x1) (- (cadr p0) sub_y1) 0.0))
  71.       (setq node_radius (sqrt (* major_axis sub_axis)));过渡圆1的半径
  72.       (setq radius_len8 (/ (expt sub_axis 2) major_axis));长轴附近插补圆半径
  73.       (setq radius_sho2 (/ (expt major_axis 2) sub_axis));短轴附近插补圆半径
  74.       (setq alpha (atan (cadr long_vectors) (car long_vectors)));根据XY轴的正负值(象限)确定旋转角度
  75.       (if (or (and (> (car long_vectors) 0) (< (cadr long_vectors) 0)) (and (> (car long_vectors) 0) (> (cadr long_vectors) 0)))
  76.         (setq alpha (+ alpha pi))
  77.       )
  78.       (if (and (< (car long_vectors) 0) (> (cadr long_vectors) 0))
  79.         (setq alpha (+ alpha 2pi))
  80.       )
  81.       ;求得插补圆的圆心C坐标、起点M和终点N点坐标(中心点在原点的正椭圆)
  82.       (setq trl1 (* 1.5 sub_axis))
  83.       (setq trl2 (* (- (expt major_axis 3) (expt sub_axis 3)) node_radius))
  84.       (setq trl3 (* (- (expt major_axis 2) (expt sub_axis 2)) major_axis))
  85.       (setq trl (- trl1 (/ trl2 trl3)))
  86.       (setq trm1 (- trl (/ (- (expt sub_axis 2) (expt major_axis 2)) sub_axis)))
  87.       (setq trm2 (1+ (/ (expt sub_axis 2) (expt major_axis 2))))
  88.       (setq trm (* length_ratio (/ trm1 trm2)))
  89.       (setq trn1 (- (expt trm1 2) (expt (- (/ (expt major_axis 2) sub_axis) node_radius) 2)))
  90.       (setq trn (/ trn1 trm2))
  91.       (setq circle_xc1 (- trm (sqrt (- (expt trm 2) trn))))
  92.       (setq circle_yc1 (+ (* (* -1 length_ratio) circle_xc1) trl))
  93.       (setq trk1 (- (/ (- (expt sub_axis 2) (expt major_axis 2)) sub_axis) circle_yc1))
  94.       (setq trk (/ circle_xc1 trk1))
  95.       (setq trv1 (- (+ (expt sub_axis 2) (* major_axis sub_axis)) (+ (* 2 (expt major_axis 2)) (expt circle_xc1 2) (expt circle_yc1 2))))
  96.       (setq trv (/ trv1 (* 2 trk1)))
  97.       (setq circle_xm1 (/ (* trk (- (/ (- (expt sub_axis 2) (expt major_axis 2)) sub_axis) trv)) (1+ (expt trk 2))))
  98.       (setq circle_ym1 (+ (* trk circle_xm1) trv))
  99.       (setq trr (/ (- (/ (- (expt major_axis 2) (expt sub_axis 2)) major_axis) circle_xc1) circle_yc1))
  100.       (setq trw1 (+ (expt circle_xc1 2) (expt circle_yc1 2) (/ (expt sub_axis 4) (expt major_axis 2))))
  101.       (setq trw2 (+ (expt node_radius 2) (expt (/ (- (expt major_axis 2) (expt sub_axis 2)) major_axis) 2)))
  102.       (setq trw (/ (- trw1 trw2) (* 2 circle_yc1)))
  103.       (setq circle_xn1 (/ (- (/ (- (expt major_axis 2) (expt sub_axis 2)) major_axis) (* trw trr)) (1+ (expt trr 2))))
  104.       (setq circle_yn1 (+ (* trr circle_xn1) trw))
  105.       (setq circle_yc2 (+ (- sub_axis radius_sho2) (cadr p0)))
  106.       (setq circle_xc2 (car p0))
  107.       (setq circle_xc8 (+ (- major_axis radius_len8) (car p0)))
  108.       (setq circle_yc8 (cadr p0))
  109.       ;对几个点做平移旋转变换,求得图元中真实椭圆的插补特征点
  110.       (setq ellipse_xc (+ circle_xc1 (car p0)));平移后插补圆1的圆心坐标
  111.       (setq ellipse_yc (+ circle_yc1 (cadr p0)))
  112.       (setq ellipse_xc1 (+ (* ellipse_xc (cos alpha)) (* -1 ellipse_yc (sin alpha)) (* (- 1 (cos alpha)) (car p0)) (* (cadr p0) (sin alpha))));旋转后的圆心坐标
  113.       (setq ellipse_yc1 (+ (* ellipse_xc (sin alpha)) (* ellipse_yc (cos alpha)) (* (- 1 (cos alpha)) (cadr p0)) (* -1 (car p0) (sin alpha))))
  114.       (setq p2 (list ellipse_xc1 ellipse_yc1 0.0));平移旋转后插补圆1的圆心坐标
  115.       (setq ellipse_xm (+ circle_xm1 (car p0)))
  116.       (setq ellipse_ym (+ circle_ym1 (cadr p0)))
  117.       (setq ellipse_xm1 (+ (* ellipse_xm (cos alpha)) (* -1 ellipse_ym (sin alpha)) (* (- 1 (cos alpha)) (car p0)) (* (cadr p0) (sin alpha))));旋转后的终点M坐标
  118.       (setq ellipse_ym1 (+ (* ellipse_xm (sin alpha)) (* ellipse_ym (cos alpha)) (* (- 1 (cos alpha)) (cadr p0)) (* -1 (car p0) (sin alpha))))
  119.       (setq p3 (list ellipse_xm1 ellipse_ym1 0.0));平移旋转后插补圆1的起点坐标
  120.       (setq ellipse_xn (+ circle_xn1 (car p0)))
  121.       (setq ellipse_yn (+ circle_yn1 (cadr p0)))
  122.       (setq ellipse_xn1 (+ (* ellipse_xn (cos alpha)) (* -1 ellipse_yn (sin alpha)) (* (- 1 (cos alpha)) (car p0)) (* (cadr p0) (sin alpha))));旋转后的圆心坐标
  123.       (setq ellipse_yn1 (+ (* ellipse_xn (sin alpha)) (* ellipse_yn (cos alpha)) (* (- 1 (cos alpha)) (cadr p0)) (* -1 (car p0) (sin alpha))))
  124.       (setq p1 (list ellipse_xn1 ellipse_yn1 0.0));平移旋转后插补圆1的终点坐标
  125.       (setq ellipse_xc2 (+ (* circle_xc2 (cos alpha)) (* -1 circle_yc2 (sin alpha)) (* (- 1 (cos alpha)) (car p0)) (* (cadr p0) (sin alpha))));旋转后的圆心坐标
  126.       (setq ellipse_yc2 (+ (* circle_xc2 (sin alpha)) (* circle_yc2 (cos alpha)) (* (- 1 (cos alpha)) (cadr p0)) (* -1 (car p0) (sin alpha))))
  127.       (setq p4 (list ellipse_xc2 ellipse_yc2 0.0));平移旋转后插补圆1的圆心坐标
  128.       (setq ellipse_xc8 (+ (* circle_xc8 (cos alpha)) (* -1 circle_yc8 (sin alpha)) (* (- 1 (cos alpha)) (car p0)) (* (cadr p0) (sin alpha))));旋转后的圆心坐标
  129.       (setq ellipse_yc8 (+ (* circle_xc8 (sin alpha)) (* circle_yc8 (cos alpha)) (* (- 1 (cos alpha)) (cadr p0)) (* -1 (car p0) (sin alpha))))
  130.       (setq p16 (list ellipse_xc8 ellipse_yc8 0.0));平移旋转后插补圆1的圆心坐标
  131.       ;利用DXF数据求得其他特征点的坐标信息
  132.       (setq p6 (trans (sl-pt-mirror p2 nod2 nod4) 0 1))
  133.       (setq p8 (trans (sl-pt-mirror p16 nod2 nod4) 0 1))
  134.       (setq p10 (trans (sl-pt-mirror p6 nod3 nod1) 0 1))
  135.       (setq p12 (trans (sl-pt-mirror p4 nod1 nod3) 0 1))
  136.       (setq p14 (trans (sl-pt-mirror p2 nod1 nod3) 0 1))
  137.       (setq p5 (trans (sl-pt-mirror p3 nod2 nod4) 0 1))
  138.       (setq p11 (trans (sl-pt-mirror p5 nod1 nod3) 0 1))
  139.       (setq p13 (trans (sl-pt-mirror p3 nod1 nod3) 0 1))
  140.       (setq p7 (trans (sl-pt-mirror p1 nod2 nod4) 0 1))
  141.       (setq p9 (trans (sl-pt-mirror p7 nod1 nod3) 0 1))
  142.       (setq p15 (trans (sl-pt-mirror p1 nod1 nod3) 0 1))
  143.       (setq epl (list (list p1 p2 p3) (list p3 p4 p5) (list p5 p6 p7) (list p7 p8 p9) (list p9 p10 p11) (list p11 p12 p13) (list p13 p14 p15)  (list p15 p16 p1)))
  144.       ;(setq epl (list p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16))
  145.     )
  146.   )
  147.   epl ;返回8段弧的坐标表 ((起点1 圆心1 终点1)(起点2 圆心2 终点2).....(起点8 圆心8 终点8))) 逆时针
  148. )
  149. ;圆弧--------(一级)------------
  150. ;图层=nil,为当前图层  ;颜色=nil,为当前图层颜色 ;线型比例=nil,为1
  151. ;(slch:arc 圆心坐标 圆半径 圆弧起点弧度 圆弧终点弧度 图层 颜色 线型比例)
  152. ;(slch:arc (getpoint "插入点") 40 (* pi (/ 270 180.0)) (* pi (/ 180 180.0)) "中心线" 6 5)
  153. (defun slch:arc (pt r ang1 ang2 lay arccol arcbili)
  154.   (entmake
  155.     (list
  156.       '(0 . "ARC")
  157.       (cons 10 pt)   ;圆心坐标
  158.       (cons 40 r)    ;圆半径
  159.       (cons 50 ang1) ;圆弧起点弧度
  160.       (cons 51 ang2) ;圆弧终点弧度
  161.       (if lay
  162.         (cons 8 lay)   ;图层
  163.         (cons 8 (getvar "CLAYER"))
  164.       )
  165.       (if arccol
  166.         (cons 62 arccol)   ;颜色
  167.         (cons 62 256)
  168.       )
  169.       (if arcbili
  170.         (cons 48 arcbili)   ;线型比例
  171.         (cons 48 (* 0.01 (getvar "DIMLFAC")))
  172.       )
  173.     )
  174.   )
  175. )
  176. ;;椭圆转8弧测试-----
  177. (defun c:tt (/ nam pis)
  178.   (setq nam (car (entsel "\n 选择椭圆")))
  179.   (setq pis (ellto8arc nam))
  180.   ;(draw-pt pis "PT-") 画点测试
  181.   (mapcar '(lambda (x) (slch:arc (cadr x) (distance (cadr x) (car x)) (angle (cadr x) (car x)) (angle (cadr x) (caddr x)) nil 1 nil )) pis)
  182.   ;(entdel nam)
  183. )




从模拟结果来看,误差不算小,还达不到使用级别,
大家有兴趣,进一步研究吧
实际上,有椭圆4心法模拟,如果误差可以,不用8弧
以下也是晓东的截图,这是膜结构小助手的,我看这4弧模拟倒还比8弧误差更小,谁能搞出来源码吗?
或谁新写个,因为高中的数学都忘干净了,这4弧的点位忘了怎么求了。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2024-7-22 13:22:01 | 显示全部楼层
 楼主| 发表于 2024-7-22 13:24:54 | 显示全部楼层
本帖最后由 尘缘一生 于 2024-7-22 16:24 编辑

这是如何画出来,反过来,有了椭圆后,作4个弧的缺没有,而我们需要的就是反过来。
发表于 2024-7-22 21:31:29 | 显示全部楼层
路过 支持源码
发表于 2024-7-24 16:23:15 | 显示全部楼层
本帖最后由 cchessbd 于 2024-7-24 16:31 编辑

这个代码太长了。精度貌似也不高。四心法精度更差一点。

CAD高精度模拟画法应该是类似下图的过程,来一段循环就行了,每3点画一段圆弧,n够大可以直接画多线。

还可以控制精度(4*90/n)。生成的圆弧也可连接为多线。

我这收藏了一个16段圆弧模拟的lsp。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2024-7-24 21:04:10 | 显示全部楼层
cchessbd 发表于 2024-7-24 16:23
这个代码太长了。精度貌似也不高。四心法精度更差一点。

CAD高精度模拟画法应该是类似下图的过程,来一 ...

直接转多段线的,节点多,
之所以转为圆弧,因为圆弧转为多段线代码完善,最终还是转为多段线,这样通过中间弧的过度一下能降低节点的数量。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 02:26 , Processed in 0.152825 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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