乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 40|回复: 19

[编程交流] 计算圆弧的凸出度。

[复制链接]

32

主题

1166

帖子

1146

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
159
发表于 2022-7-6 11:14:04 | 显示全部楼层 |阅读模式
我使用了一个具有多段线命令调用的程序来制作弯头。
我将其更改为一个entmake程序,该程序从一条连续多段线生成相同类型的弯头。
 
下面是从该肘部返回的列表示例。
 
在下表中,DXF代码42表示圆弧的凸起。
 
  1. (-1 . <Entity name: 7ef6fe40>)
  2. (0 . "LWPOLYLINE")
  3. (330 . <Entity name: 7ef6dcf8>)
  4. (5 . "A30")
  5. (100 . "AcDbEntity")
  6. (67 . 0)
  7. (410 . "Model")
  8. (8 . "M-HVAC-SUPP")
  9. (100 . "AcDbPolyline")
  10. (90 . 4)
  11. (70 . 1)
  12. (43 . 0.0)
  13. (38 . 0.0)
  14. (39 . 0.0)
  15. (10 -730.727 -201.462)
  16. (40 . 0.0)
  17. (41 . 0.0)
  18. [color=red](42 . 0.414214)[/color]
  19. (10 -724.727 -195.462)
  20. (40 . 0.0)
  21. (41 . 0.0)
  22. (42 . 0.0)
  23. (10 -676.727 -195.462)
  24. (40 . 0.0)
  25. (41 . 0.0)
  26. [color=red](42 . -0.414214)[/color]
  27. (10 -730.727 -249.462)
  28. (40 . 0.0)
  29. (41 . 0.0)
  30. (42 . 0.0)
  31. (210 0.0 0.0 1.0)

 
我试图弄清楚如何写一个计算,并将其值放入一个变量中,用于此。我假设这是一个三角学问题,对此几乎没有经验。
 
有谁能帮我弄清楚这件事吗?
提前感谢,
秃鹰
121407lb3r1bowkm6e31qv.jpg
回复

使用道具 举报

1

主题

316

帖子

311

银币

初来乍到

Rank: 1

铜币
29
发表于 2022-7-6 11:18:08 | 显示全部楼层
凸出是夹角的1/4的切线。正值在方向上为逆时针方向:
 
凸度=tan(ang/4)
回复

使用道具 举报

32

主题

1166

帖子

1146

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
159
发表于 2022-7-6 11:22:53 | 显示全部楼层
 
谢谢wizman!
 
我要试一试。
 
秃鹰
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 11:26:05 | 显示全部楼层
这是Duff Kirkland的一些旧东西
  1. ; AutoLISP function to convert from Polyline "Bulge" representation
  2. ; of an arc to AutoCAD's normal "center, radius, start/end angles"
  3. ; form of arc.  This function applies the bulge between two adjacent
  4. ; vertices.  It assumes that global symbols "sp", "ep", and "bulge"
  5. ; contain the current vertex (start point), next vertex (end point),
  6. ; and bulge, respectively.  It sets the appropriate values in global
  7. ; symbols "cen", "rad", "sa", and "ea".
  8. ; by Duff Kurland - Autodesk, Inc.
  9. ; July 7, 1986
  10. (defun cvtbulge (/ cotbce x1 x2 y1 y2 temp)
  11. (setq x1 (car  sp) x2 (car  ep))
  12. (setq y1 (cadr sp) y2 (cadr ep))
  13. (setq cotbce (/ (- (/ 1.0 bulge) bulge) 2.0))
  14. ; Compute center point and radius
  15. (setq cen (list (/ (+ x1 x2 (- (* (- y2 y1) cotbce))) 2.0)
  16.                  (/ (+ y1 y2    (* (- x2 x1) cotbce) ) 2.0))
  17. )
  18. (setq rad (distance cen sp))
  19. ; Compute start and end angles
  20. (setq sa  (atan (- y1 (cadr cen)) (- x1 (car cen))))
  21. (setq ea  (atan (- y2 (cadr cen)) (- x2 (car cen))))
  22. (if (< sa 0.0)                      ; Eliminate negative angles
  23.     (setq sa (+ sa (* 2.0 pi)))
  24. )
  25. (if (< ea 0.0)
  26.     (setq ea (+ ea (* 2.0 pi)))
  27. )
  28. (if (< bulge 0.0)                   ; Swap angles if clockwise
  29.     (progn
  30.        (setq temp sa)
  31.        (setq sa ea)
  32.        (setq ea temp)
  33.     )
  34. )
  35. )

 
-大卫
回复

使用道具 举报

32

主题

1166

帖子

1146

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
159
发表于 2022-7-6 11:29:32 | 显示全部楼层
 
 
我也感谢你,大卫。
里面有很多好东西。
回复

使用道具 举报

1

主题

316

帖子

311

银币

初来乍到

Rank: 1

铜币
29
发表于 2022-7-6 11:30:13 | 显示全部楼层
从图中可以看出,两者具有相同的凸出值,以计算:
 
切线(90/4)=0.4142(+/-)
回复

使用道具 举报

32

主题

1166

帖子

1146

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
159
发表于 2022-7-6 11:35:52 | 显示全部楼层
 
这是真的wizman,但一个应该是积极的,另一个应该是消极的。
 
 
 
对不起,我在你编辑之前回复了。
回复

使用道具 举报

1

主题

316

帖子

311

银币

初来乍到

Rank: 1

铜币
29
发表于 2022-7-6 11:38:50 | 显示全部楼层
没关系Buzz,
 
(defun Tan(X)
(if(zerop(cos X))
(提示“切线错误”)
(/(sin X)(cos X)))
 
(tan(/(/pi 2)4))
=> 0.4142
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:41:31 | 显示全部楼层
Bulge带来更多乐趣:
 
  1. (defun c:bulge (/ *error* ENT GR INDEX OBJ P1 P2 TAN UFLAG )
  2. ;; Modification of code by ElpanovEvgeniy, by Lee Mac
  3. (vl-load-com)
  4. (setq *doc* (cond (*doc*) ((vla-get-ActiveDocument (vlax-get-acad-object)))))
  5. (defun *error* (msg)
  6.    (and uFlag (vla-EndUndoMark *doc*))
  7.    (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
  8.        (princ (strcat "\n** Error: " msg " **")))
  9.    (princ))
  10. (setq tan '((a) (/ (sin a) (cos a))))
  11. (while
  12.    (progn
  13.      (setq ent (entsel "\nSelect LWPolyline: "))
  14.      (cond (  (vl-consp ent)
  15.               (if (eq "LWPOLYLINE" (cdr (assoc 0 (entget (car ent)))))
  16.                 (progn
  17.                   (setq uFlag (not (vla-StartUndoMark *doc*)))
  18.                   
  19.                   (setq index (fix (vlax-curve-getParamatPoint (car ent)
  20.                                      (vlax-curve-getClosestPointto (car ent) (cadr ent)))))
  21.                   (mapcar (function set) '(p1 p2)
  22.                           (mapcar (function vlax-curve-getPointatParam) (list (car ent) (car ent))
  23.                                   (list index (1+ index))))
  24.                   (setq obj (vlax-ename->vla-object (car ent)))
  25.                   (while (= 5 (car (setq gr (grread 't 4 0))))
  26.                     (vla-SetBulge obj index (tan (/ (- (angle (cadr gr) p2) (angle p1 (cadr gr))) 2.))))
  27.                   (setq uFlag (vla-EndUndomark *doc*)))
  28.                 (princ "\n** Object Must be an LWPolyline **"))))))
  29. (princ))

 
  1. (defun c:cam3 (/ ANG BLG C1 CEN CEN2 CODE DATA DELTA DIS
  2.                 EN GR IANG LEN LST POLY RAD RAD1 RAD2 TAN)
  3. ;; by Lee McDonnell (Lee Mac)  ~  19.12.2009
  4. (vl-load-com)
  5. (if (setq cen (getpoint "\nPick Center of First Radius: "))
  6.    (progn
  7.      (setq poly (entmakex
  8.                   (list
  9.                     (cons 0 "LWPOLYLINE")
  10.                     (cons 100 "AcDbEntity")
  11.                     (cons 100 "AcDbPolyline")
  12.                     (cons 90 2)
  13.                     (cons 70 1)
  14.                     (cons 10 cen)
  15.                     (cons 10 (polar cen 0 1.))))
  16.            en   (reverse
  17.                   (vl-member-if
  18.                     (function
  19.                       (lambda (x)
  20.                         (= 39 (car x))))
  21.                     (reverse (entget poly)))))
  22.      
  23.      (princ "\nPick First Radius: ")
  24.      
  25.      (while
  26.        (progn
  27.          (setq gr (grread 't 15 0) code (car gr) data (cadr gr))
  28.          (cond (  (and (= 5 code) (listp data))
  29.                   (setq ang (angle cen data)
  30.                         dis (distance cen data))
  31.                   (entmod
  32.                     (append en
  33.                       (setq lst
  34.                         (list
  35.                           (cons 10 data)
  36.                           (cons 42 1.)
  37.                           (cons 10 (polar data (+ ang pi) (* 2. dis)))
  38.                           (cons 42 1.))))))
  39.                (  (and (= 3 code) (listp data))
  40.                   (setq en
  41.                     (append en
  42.                       (setq lst
  43.                         (list
  44.                           (cons 10 data)
  45.                           (cons 42 1.)
  46.                           (cons 10 (polar data (+ ang pi) (* 2. dis)))
  47.                           (cons 42 1.)
  48.                           (cons 10 data))))
  49.                         en (reverse
  50.                              (vl-member-if
  51.                                (function
  52.                                  (lambda (x)
  53.                                    (= 39 (car x))))
  54.                                (reverse
  55.                                  (entmod
  56.                                    (subst (cons 90 3) (assoc 90 en) en)))))
  57.                         
  58.                         rad (distance cen data))
  59.                   (princ "\nPick Center of Second Radius: ")
  60.                   (while
  61.                     (progn
  62.                       (setq gr (grread 't 15 0) code (car gr) data (cadr gr))
  63.                       (cond (  (and (= 5 code) (listp data))
  64.                                (setq dis (distance cen data) ang (angle cen data))
  65.                                (if (< rad dis)
  66.                                  (progn
  67.                                    (setq tan  (sqrt (- (* dis dis) (* rad rad)))
  68.                                          iAng (atan tan rad)
  69.                                          blg  (/ (sin (* 0.5 (- pi iAng)))
  70.                                                  (cos (* 0.5 (- pi iAng)))))
  71.                                    (entmod
  72.                                      (append en
  73.                                        (setq lst
  74.                                          (list
  75.                                            (cons 10 data)
  76.                                            (cons 10 (polar cen (+ ang iAng) rad))
  77.                                            (cons 42 blg)
  78.                                            (cons 10 (polar cen (- ang iAng) rad))))))) t))
  79.                             (  (and (= 3 code) (listp data))
  80.                                (setq dis (distance cen data) ang (angle cen data))
  81.                                (if (< rad dis)
  82.                                  (progn
  83.                                    (setq tan  (sqrt (- (* dis dis) (* rad rad)))
  84.                                          iAng (atan tan rad)
  85.                                          blg  (/ (sin (* 0.5 (- pi iAng)))
  86.                                                  (cos (* 0.5 (- pi iAng)))))
  87.                                    (setq en
  88.                                      (append en
  89.                                        (list
  90.                                          (cons 10 data)
  91.                                          (cons 10 data)
  92.                                          (cons 10 (polar cen (+ ang iAng) rad))
  93.                                          (cons 42 blg)
  94.                                          (cons 10 (polar cen (- ang iAng) rad)))))
  95.                                    (setq en (reverse
  96.                                               (vl-member-if
  97.                                                 (function
  98.                                                   (lambda (x)
  99.                                                     (= 39 (car x))))
  100.                                                 (reverse
  101.                                                   (entmod
  102.                                                     (subst (cons 90 4) (assoc 90 en) en)))))
  103.                                          cen2 data len (distance cen cen2) ang (angle cen cen2))
  104.                                    (princ "\nPick Second Radius: ")
  105.                                    
  106.                                    (while
  107.                                      (progn
  108.                                        (setq gr (grread 't 15 0) code (car gr) data (cadr gr))
  109.                                        
  110.                                        (cond (  (and (= 5 code) (listp data))
  111.                                              
  112.                                                 (setq rad2 (distance cen2 data) delta (- rad rad2))
  113.                                                 (if (< (abs delta) len)
  114.                                                   (progn
  115.                                                     (setq tan  (sqrt (- (* len len) (* delta delta))) iAng (atan tan delta)
  116.                                                    
  117.                                                           blg1 (/ (sin (* 0.5 (- pi iAng))) (cos (* 0.5 (- pi iAng))))
  118.                                                           blg2 (/ (sin (* 0.5 iAng))        (cos (* 0.5 iAng))))
  119.                                              
  120.                                                     (entmod
  121.                                                       (append en
  122.                                                         (list
  123.                                                           (cons 10 (polar cen  (+ ang iAng) rad))
  124.                                                           (cons 42 blg1)
  125.                                                           (cons 10 (polar cen  (- ang iAng) rad))
  126.                                                       
  127.                                                           (cons 10 (polar cen2 (- ang iAng) rad2))
  128.                                                           (cons 42 blg2)
  129.                                                           (cons 10 (polar cen2 (+ ang iAng) rad2)))))) t))
  130.                                              
  131.                                              (  (and (= 3 code) (listp data)) nil)
  132.                                              (t )))))))
  133.                             (t )))))
  134.                (t ))))))
  135. (princ))
回复

使用道具 举报

32

主题

1166

帖子

1146

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
159
发表于 2022-7-6 11:42:42 | 显示全部楼层
 
威兹曼,
 
在lisp中进行计算时,角度或ang是否需要用弧度表示?
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-6 11:23 , Processed in 0.716576 second(s), 75 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表