明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: highflybird

多边形的最大内接圆

    [复制链接]
发表于 2012-8-9 10:44 | 显示全部楼层
chlh_jd 发表于 2012-8-5 23:45
GP再改进:
1.为了适应任意管状封闭曲线, 将第一步网格数的确定方式改为自适应方式,即使用周长与面积的开 ...

感谢chlh_jd 精彩的回复和改进。待有时间了,我也来完善一下。
发表于 2012-8-9 10:44 | 显示全部楼层
chlh_jd 发表于 2012-8-5 23:45
GP再改进:
1.为了适应任意管状封闭曲线, 将第一步网格数的确定方式改为自适应方式,即使用周长与面积的开 ...

感谢chlh_jd 精彩的回复和改进。待有时间了,我也来完善一下。
发表于 2012-8-9 12:16 | 显示全部楼层
highflybir 发表于 2012-8-9 10:44
感谢chlh_jd 精彩的回复和改进。待有时间了,我也来完善一下。

期待大师出手,解决应用效率低问题。
发表于 2012-8-10 12:43 | 显示全部楼层
斑竹客气了,还望多指教指教
发表于 2012-8-10 14:07 | 显示全部楼层
改进点在任意多段线内的判断(参考狂刀的函数),去掉GRID+步骤,程序变得更加高效
  1. ;;; maximum circle inscribed in a closed polyline
  2. ;;; writed by Gian Paolo Cattaneo
  3. ;;; edited by GSLS(SS) 2012-8-5

  4. (defun C:TesT (/        POLY         POLY_vl  Dx           Dy            Lp
  5.                List_vert_poly         list_p_int           P_center dist
  6.                step1        step2         t1          t2        t3  t4    R0            area
  7.                len        i         
  8.               )
  9.   (gc)
  10.   (prompt "\nSelect Polyline: ")
  11.   (if (setq POLY (ssname (ssget ":S" '((0 . "LWPOLYLINE"))) 0))
  12.     (progn
  13.       (setq i 1)
  14.       (setq area (vlax-curve-getArea poly)
  15.             len         (vlax-curve-getDistAtParam
  16.                    poly
  17.                    (vlax-curve-getEndParam poly)
  18.                  )
  19.       )
  20.       (setq step1 (max 10 (fix (/ len 0.4 (sqrt area))))) ;_--> grid_1      
  21.       (setq step2 10) ;_--> grid_2
  22.       (setq list_vert_poly (LWPoly->List POLY 10))      
  23.       (grid_1)
  24.       (setq t1 (getvar "MilliSecs"))
  25.       (Point_int)
  26.       (setq t2 (getvar "MilliSecs"))
  27.       ;|
  28.       (foreach a list_p_int
  29.         (entmake (list (cons 0 "POINT")
  30.                        (cons 10 a)
  31.                        (cons 62 3))))|;
  32.       ;_(grid+)
  33.       (Point_center)
  34.       (setq t3 (getvar "MilliSecs"))
  35.       (setq i 0)
  36.       (while (and (> (- Dist R0) 1e-8) (< i 10))
  37.         (grid_2)
  38.         (Point_center)
  39.         (setq i (1+ i))
  40.       )
  41.       (setq t4 (getvar "MilliSecs"))
  42.       (entmake
  43.         (list
  44.           (cons 0 "CIRCLE")
  45.           (cons 10 P_center)
  46.           (cons 40 dist)
  47.         )
  48.       )
  49.       (princ
  50.         (strcat "\ntime1 = " (rtos (- t2 t1) 2 0) " MilliSecs")
  51.       )
  52.       (princ
  53.         (strcat "\ntime2 = " (rtos (- t3 t2) 2 0) " MilliSecs")
  54.       )
  55.       (princ
  56.         (strcat "\ntime3 = " (rtos (- t4 t3) 2 0) " MilliSecs")
  57.       )
  58.       (princ)
  59.     )
  60.   )
  61. )

  62. ;; Restituisce una griglia di punti all'interno del getboundingbox della poly selezionata
  63. ;; Returns a grid of points within the BoundingBox of the selected poly
  64. (defun grid_1 (/ p1 p2 X1 Y1 l1)
  65.   (vla-getboundingbox (vlax-ename->vla-object POLY) 'p1 'p2)
  66.   (setq        p1 (vlax-safearray->list p1)
  67.         p2 (vlax-safearray->list p2)
  68.         p1 (list (car p1) (cadr p1))
  69.         p2 (list (car p2) (cadr p2))
  70.   )
  71.   (setq Dx (/ (- (car p2) (car p1)) step1))
  72.   (setq Dy (/ (- (cadr p2) (cadr p1)) step1))
  73.   (setq        Lp (list p1)
  74.         X1 (car p1)
  75.         Y1 (cadr p1)
  76.   )
  77.   (repeat step1
  78.     (setq Lp (cons (list (setq X1 (+ X1 Dx)) Y1) Lp))
  79.   )
  80.   (setq Lp (list Lp))
  81.   (repeat step1
  82.     (setq Lp (cons (mapcar (function (lambda (x)
  83.                                        (list (car x) (+ (cadr x) Dy))
  84.                                      )
  85.                            )
  86.                            (car lp)
  87.                    )
  88.                    Lp
  89.              )
  90.     )
  91.   )
  92.   (setq Lp (apply (function append) Lp))
  93. )
  94. ;; Restituisce una griglia di punti intorno al punto centrale (provvisorio)
  95. ;; Returns a grid of points around the center point (provisional)
  96. (defun grid_2 (/ X1 Y1 P1)
  97.   (setq        list_p_int nil
  98.         X1           (- (car P_center) Dx)
  99.         Y1           (- (cadr P_center) Dy)
  100.         P1           (list X1 Y1)
  101.         Dx           (/ (* 2 Dx) step2)
  102.         Dy           (/ (* 2 Dy) step2)
  103.   )
  104.   (setq list_p_int (list P1))
  105.   (repeat step2
  106.     (setq list_p_int (cons (list (setq X1 (+ X1 Dx)) Y1) list_p_int))
  107.   )
  108.   (setq list_p_int (list list_p_int))
  109.   (repeat step2
  110.     (setq list_p_int
  111.            (cons (mapcar (function (lambda (x)
  112.                                      (list (car x) (+ (cadr x) Dy))
  113.                                    )
  114.                          )
  115.                          (car list_p_int)
  116.                  )
  117.                  list_p_int
  118.            )
  119.     )
  120.   )
  121.   (setq list_p_int (apply (function append) list_p_int))
  122. )
  123. ;; restituisce la lista dei punti interni ad un poligono
  124. ;; dati:  - lista coordinate dei punti -> Lp
  125. ;;        - lista coordinate vertici poligono -> list_vert_poly
  126. ;; Returns the list of points inside the polyline
  127. (defun Point_int ()
  128.   (setq        list_p_int
  129.          (vl-remove-if-not
  130.            (function
  131.              (lambda (pt)
  132.                ;_determine point in curve , use widding number
  133.                (equal
  134.                  PI
  135.                  (abs
  136.                    (apply
  137.                      (function +)
  138.                      (mapcar (function (lambda (x y / a)
  139.                                          (rem (- (angle pt x) (angle pt y)) PI)
  140.                                        )
  141.                              )
  142.                              list_vert_poly
  143.                              (cdr list_vert_poly)
  144.                      )
  145.                    )
  146.                  )
  147.                  1e-8
  148.                )
  149.              )
  150.            )
  151.            Lp
  152.          )
  153.   )
  154. )
  155. ;; Infittisce la griglia inserendo altri punti
  156. ;; nel centro delle diagonali tra i punti interni
  157. ;; Insert points (interior) to increase the density of the grid
  158. (defun grid+ (/ G+)
  159.   (setq        G+
  160.          (mapcar '(lambda (x)
  161.                     (list (+ (car x) (/ Dx 2)) (+ (cadr x) (/ Dy 2)))
  162.                   )
  163.                  list_p_int
  164.          )
  165.   )
  166.   (setq list_p_int (append G+ list_p_int))
  167. )
  168. ;; Da una lista di punti restituisce quello più lontano da un oggetto
  169. ;; dati:  - lista dei punti -> list_p_int
  170. ;;        - oggetto -> POLY_vl
  171. ;; Returns the farthest point from the polyline
  172. (defun Point_center (/ Pa Pvic)
  173.   (foreach Pa list_p_int
  174.     (setq Pvic (vlax-curve-getClosestPointTo Poly Pa))
  175.     (if        (> (distance Pa Pvic) Dist)
  176.       (setq P_center Pa
  177.             R0             Dist
  178.             Dist     (distance Pa Pvic)
  179.       )
  180.     )
  181.   )
  182. )
  183. ;;
  184. (defun LWPoly->List (en acc / a b vetex bu p1 p2 l r ang an1 N)
  185.   ;;Acc --- 0 ~ 99
  186.   (setq ent (entget en))
  187.   (while (setq ent (member (assoc 10 ent) ent))
  188.     (setq b        (cons (cdar ent) b)
  189.           ent        (member (assoc 42 ent) ent)
  190.           b        (cons (cdar ent) b)
  191.           ent        (cdr ent)
  192.           vetex        (cons b vetex)
  193.           b        nil
  194.     )
  195.   )
  196.   (while vetex
  197.     (setq a        (car vetex)
  198.           vetex        (cdr vetex)
  199.           bu        (car a)
  200.           p1        (cadr a)
  201.     )
  202.     (if        l
  203.       (setq p2 (car l))
  204.       (setq p2 (cadr (last vetex))
  205.             l  (cons p2 l)
  206.       )
  207.     )
  208.     (if        (equal bu 0 1e-6)
  209.       (setq l (cons p1 l))
  210.       (progn
  211.         (setq ang (* 2 (atan bu))
  212.               r          (/ (distance p1 p2)
  213.                      (* 2 (sin ang))
  214.                   )
  215.               c          (polar p1
  216.                          (+ (angle p1 p2) (- (/ pi 2) ang))
  217.                          r
  218.                   )
  219.               r          (abs r)
  220.               ang (abs (* ang 2.0))
  221.               N          (abs (fix (/ ang 0.0174532925199433)))
  222.               N          (min N (1+ Acc))
  223.         )
  224.         (if (= N 0)
  225.           (setq l (cons p1 l))
  226.           (progn
  227.             (setq an1 (/ ang N)
  228.                   ang (angle c p2)
  229.             )
  230.             (if        (not (minusp bu))
  231.               (setq an1 (- an1))
  232.             )
  233.             (repeat (1- N)
  234.               (setq ang        (+ ang an1)
  235.                     l        (cons (polar c ang r) l)
  236.               )
  237.             )
  238.             (setq l (cons p1 l))
  239.           )
  240.         )
  241.       )
  242.     )
  243.   )
  244.   l
  245. )


本帖子中包含更多资源

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

x
发表于 2012-8-24 08:12 | 显示全部楼层
求arx代码
发表于 2012-10-24 13:39 | 显示全部楼层
chlh_jd 发表于 2012-8-10 14:07
改进点在任意多段线内的判断(参考狂刀的函数),去掉GRID+步骤,程序变得更加高效

命令: A
Select Polyline:
选择对象:
; 错误: 参数类型错误: lselsetp nil

试了各个源码均出错,不知是什么原因,请指点,谢谢
发表于 2012-10-24 14:38 | 显示全部楼层
下了就要顶!!
发表于 2012-10-24 18:27 | 显示全部楼层
vl vla vlax 这些函数能力强劲!资料·····
发表于 2012-10-24 19:42 | 显示全部楼层
强大....我想要找多义线最窄处,不知有没有思路....
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-17 16:57 , Processed in 0.256586 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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