AutoCAD中多点创建最佳拟合圆的嵌入代码实现方案咨询
AutoCAD多点最佳拟合圆实现方案
AutoCAD原生CIRCLE命令确实仅支持最多3点定圆,要实现多点最小二乘最佳拟合圆,不需要安装第三方插件,写一段AutoLISP代码嵌入即可使用,步骤如下:
- 将下方代码复制,保存为后缀为
.lsp的本地文件,比如命名为FitCircle.lsp - 打开AutoCAD,输入命令
APPLOAD,在弹出的文件选择窗口中选中刚才保存的LISP文件,点击「加载」,看到加载成功提示即可 - 加载完成后直接输入自定义命令
FITCIRCLE,按照提示选中所有用于拟合的点对象,回车后会自动计算并生成最佳拟合圆,命令行会同步输出拟合得到的圆心坐标与半径值。
可直接使用的拟合代码如下:
(defun c:fitcircle (/ *error* ss n p x y sx sy sxx syy sxy sxxx sxxy syyy d a b c xc yc r) (defun *error* (msg) (if (not (wcmatch (strcase msg) "*BREAK*,*CANCEL*,*EXIT*")) (princ (strcat "\n运行错误: " msg)) ) (princ) ) (vl-load-com) (if (setq ss (ssget '((0 . "POINT")))) (progn (setq n 0 sx 0 sy 0 sxx 0 syy 0 sxy 0 sxxx 0 sxxy 0 syyy 0) (repeat (sslength ss) (setq p (cdr (assoc 10 (entget (ssname ss n)))) x (car p) y (cadr p) sx (+ sx x) sy (+ sy y) sxx (+ sxx (* x x)) syy (+ syy (* y y)) sxy (+ sxy (* x y)) sxxx (+ sxxx (* x x x)) sxxy (+ sxxy (* x x y)) syyy (+ syyy (* y y y)) n (1+ n) ) ) (setq d (- (* (- (* n sxx) (* sx sx)) (- (* n syy) (* sy sy))) (* (- (* n sxy) (* sx sy)) (- (* n sxy) (* sx sy))))) (setq a (/ (- (* (- (* (+ sxxx sxxy) (* sx (/ syy n))) (* sy sxy)) (- (* n sxy) (* sx sy)) (* (- (* (+ syyy sxxy) (* sy (/ sxx n))) (* sx sxy)) (- (* n sxx) (* sx sx)))) d) b (/ (- (* (- (* (+ syyy sxxy) (* sy (/ sxx n))) (* sx sxy)) (- (* n syy) (* sy sy)) (* (- (* (+ sxxx sxxy) (* sx (/ syy n))) (* sy sxy)) (- (* n sxy) (* sx sy)))) d) c (/ (+ (* a sx) (* b sy) (- 0 sxx) (- 0 syy)) n) xc (* -0.5 a) yc (* -0.5 b) r (sqrt (- (+ (* xc xc) (* yc yc)) c)) ) (entmake (list '(0 . "CIRCLE") (cons 10 (list xc yc 0.0)) (cons 40 r))) (princ (strcat "\n拟合完成 | 圆心: (" (rtos xc) ", " (rtos yc) ") | 半径: " (rtos r))) ) (princ "\n未选中有效点对象") ) (princ) )
使用注意事项
- 默认代码仅支持选中独立的POINT点对象参与计算,如果需要用多段线顶点、块插入点、线端点等其他图元的特征点拟合,把代码中
(ssget '((0 . "POINT")))修改为(ssget)即可手动框选任意图元。 - 选点时尽量均匀覆盖整个圆周,不要把所有选点集中在一小段圆弧上,否则会增大拟合误差。
- 如果需要每次启动AutoCAD都能直接使用这个命令,在
APPLOAD弹出的窗口里找到「启动组」选项,把这个LISP文件添加进去即可实现开机自动加载。 - 代码采用标准最小二乘拟合算法,生成的圆满足所有选点到圆周的距离平方和最小,适合测绘测点逆向、轮廓修正等场景使用。
内容的提问来源于stack exchange,提问作者user3047214
相关产品推荐
相关产品推荐

