乐筑天下

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

[编程交流] a中内接的最大圆

[复制链接]

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 09:28:08 | 显示全部楼层
 
我们有:
 
1) 很明显,圆在边界内。
2) 圆必须至少在两个位置接触边界。
回复

使用道具 举报

GP_

8

主题

248

帖子

245

银币

初来乍到

Rank: 1

铜币
42
发表于 2022-7-6 09:33:52 | 显示全部楼层
谢谢你的建议。
 
李,我试着看一看,但我认为这(对我来说)会很难。。。
回复

使用道具 举报

GP_

8

主题

248

帖子

245

银币

初来乍到

Rank: 1

铜币
42
发表于 2022-7-6 09:39:37 | 显示全部楼层
正如我所料,修改李的代码对我来说非常困难。
 
我走了另一条路,也许并不完美,但它解决了我的问题。
 
 
笔记:
 
-增加步骤1的值以获得更大的结果确定性
 
-我认为step1=60是一段很好的关系时间/准确性
 
-函数LM:LWPoly->lisp MinimumEnclosingCircle列表(Lee Mac)而不是我的Vert\u poly也描述了多段线的曲线,如果插入lisp,也可以使用曲线多段线进行检查。
 
 
最后,对不起我的英语。
 
 
  1. (defun C:TEST (/ Dx Dy Lp List_vert_poly list_p_int P_center dist)
  2.    (prompt "\nSelect Polyline: ")
  3.    (setq POLY_vl (vlax-ename->vla-object (ssname (ssget ":S" '((0 . "POLYLINE,LWPOLYLINE"))) 0)))
  4.    (Vert_poly)
  5.    (grid_1)   
  6.    (Point_int)  
  7.    (Point_center)
  8.    (repeat 3
  9.        (grid_2)
  10.        (Point_center)
  11.    )
  12.    (entmake
  13.        (list
  14.            (cons 0 "CIRCLE")
  15.            (cons 8 (getvar "clayer"))
  16.            (cons 10 P_center)
  17.            (cons 40 dist)
  18.        )
  19.    )
  20.    (princ)
  21. )
  22. ; Returns a list of polyline vertices
  23. (defun Vert_poly (/ n_par pt)
  24.    (setq list_vert_poly nil)
  25.    (setq n_par (fix (vlax-curve-getendparam POLY_vl)))
  26.    (repeat n_par
  27.        (setq pt (vlax-curve-getpointatparam POLY_vl (setq n_par (1- n_par))))
  28.        (setq list_vert_poly (cons pt list_vert_poly))
  29.        (if (/= (last pt) 0.0)
  30.            (progn
  31.            (alert (strcat "Invalid Object Selected"
  32.                               "\nz-coordinate vertices not = 0.0"))
  33.            (exit)
  34.            )
  35.        )
  36.    )
  37. )
  38. ; Returns a grid of points within the BoundingBox of the selected poly
  39. (defun grid_1 (/ P1_ P2_ n P> step1)
  40.    (setq step1 60)
  41.    (vla-getboundingbox POLY_vl 'p1 'p2)
  42.    (setq P1_ (vlax-safearray->list p1))
  43.    (setq P2_ (vlax-safearray->list p2))
  44.    (setq P1_ (list (car P1_) (cadr P1_)))
  45.    (setq P2_ (list (car P2_) (cadr P2_)))
  46.    (setq Dx (/ (- (car P2_) (car P1_)) step1))
  47.    (setq Dy (/ (- (cadr P2_) (cadr P1_)) step1))
  48.    (setq n 0)
  49.    (setq P> P1_)
  50.    (setq Lp (list P1_))
  51.    (repeat (* (1+ step1) step1)
  52.        (setq P> (list (+ (car P>) Dx) (cadr P>)))
  53.        (setq Lp (cons P> Lp))
  54.        (setq n (1+ n))
  55.        (if (= n step1)
  56.            (progn
  57.                (setq n 0)
  58.                (setq P1_ (list (car P1_) (+ (cadr P1_) Dy)))
  59.                (setq P> P1_)
  60.                (setq Lp (cons P> Lp))
  61.            )
  62.        )
  63.    )
  64. )
  65. ; Returns a grid of dots around the center point (provisional)
  66. (defun grid_2 (/ P1_ step2 P> n)
  67.    (setq step2 30)
  68.    (setq list_p_int nil)
  69.    (setq P1_ (list (- (car P_center) Dx) (- (cadr P_center) Dy)))
  70.    (setq Dx (/ (* 2 Dx) step2))
  71.    (setq Dy (/ (* 2 Dy) step2))
  72.    (setq n 0)
  73.    (setq P> P1_)
  74.    (setq list_p_int (list P1_))
  75.    (repeat (* (1+ step2) step2)
  76.        (setq P> (list (+ (car P>) Dx) (cadr P>)))
  77.        (setq list_p_int (cons P> list_p_int))
  78.        (setq n (1+ n))
  79.        (if (= n step2)
  80.            (progn
  81.                (setq n 0)
  82.                (setq P1_ (list (car P1_) (+ (cadr P1_) Dy)))
  83.                (setq P> P1_)
  84.                (setq list_p_int (cons P> list_p_int))
  85.            )
  86.        )
  87.    )
  88. )
  89. ; Returns the list of points inside the polyline
  90. (defun Point_int (/ P_distant n Pr cont attr p# Pa Pa_ Pb )
  91.    (setq P_distant (polar (car Lp) 0 10000000))
  92.    (setq list_p_int nil)
  93.    (repeat (setq n (length Lp))
  94.        (setq Pr (nth (setq n (1- n)) Lp))
  95.        (setq cont -1)
  96.        (setq attr 0)
  97.        (setq p# nil)
  98.        (setq Pa (nth (setq cont (1+ cont)) list_vert_poly))
  99.        (setq Pa_ Pa)
  100.        (repeat (length list_vert_poly)
  101.            (setq Pb (nth (setq cont (1+ cont)) list_vert_poly))
  102.            (if (= cont (length list_vert_poly)) (setq Pb Pa_))
  103.            (setq P# (inters Pa Pb Pr P_distant))
  104.            (if (/= P# nil) (setq attr (1+ attr)))
  105.            (setq Pa Pb)
  106.        )
  107.        (if (> (rem attr 2) 0) (setq list_p_int (cons Pr list_p_int)))     
  108.    )
  109. )
  110. ; Returns the farthest point from the polyline
  111. (defun Point_center (/ Pa n Pvic)
  112.    (setq Dist 0.0000001)
  113.    (setq P_center nil)
  114.    (repeat (setq n (length list_p_int))
  115.        (setq Pa (nth (setq n (1- n)) list_p_int))
  116.        (setq Pvic (vlax-curve-getClosestPointTo POLY_vl Pa))
  117.        (if (> (distance Pa Pvic) Dist)
  118.            (progn
  119.                (setq P_center Pa)
  120.                (setq Dist (distance Pa Pvic))
  121.            )
  122.        )
  123.    )
  124. )
  125. (vl-load-com)
  126. (princ)
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
211
发表于 2022-7-6 09:42:55 | 显示全部楼层
漂亮的GP\U
回复

使用道具 举报

GP_

8

主题

248

帖子

245

银币

初来乍到

Rank: 1

铜币
42
发表于 2022-7-6 09:46:44 | 显示全部楼层
谢谢pBe
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-7 08:07 , Processed in 1.420426 second(s), 60 queries .

© 2020-2025 乐筑天下

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