;;;************************************

;;;求最小包围圆的lisp程序--------------

;;;其算法为参见了有关文献--------------

;;;这种算法在退化很严重的情况结果也正确

;;;其中程序主段是核心算法,其他的附加程

;;;序为取点,画点,画圆和半径,用来测试

;;;************************************

(defun C:test (/ )

;;取点,画点,并对函数用时计算-------

(setq ss (ssget '((0 . "POINT,LINE,POLYLINE,LWPOLYLINE"))))

(setq pts (ssgetpoint ss))

(setq t0 (getvar "TDUSRTIMER"))

;;(setq x (mincir pts))

(setq x (mdesc pts nil))

(princ "n用时")

(princ (* (- (getvar "TDUSRTIMER") t0) 86400)) ;结束计时

(princ "秒")

(if (null x)

(alert "点的有效数目太小,请重新输入!")

(progn

(setq cen (car x)

rad (cdr x)

;;rad (cadr x)

;;ptmax (caddr x)

)

;;画圆及半径,列出圆的圆心半径值

(make-circle cen rad)

;;(make-line cen ptmax)

)

)

(princ)

)

;;;************************************

;;;求最小包围圆的函数,空集返回空集,否

;;;则返回最小圆的圆心,半径和圆上的一点

;;;这是程序的主段----------------------

;;;************************************

(defun mincir (ptlist / CEN CEN_R P1 P2 P3 PTMAX R rad X i)

;;判断有效点个数---------------------

(cond

((= (length ptlist) 0)

nil

)

((= (length ptlist) 1)

(alert "点集为一点,最小圆半径为0")

(list (car ptlist) 0 (car ptlist))

)

((= (length ptlist) 2)

(alert "点集为两点,最小圆为过两点的圆")

(setq cen (mid (car ptlist) (cadr ptlist))

rad (/ (distance (car ptlist) (cadr ptlist)) 2)

)

(list cen rad (car ptlist))

)

(t

;;开始递归运算----------------------------

(setq p1 (car ptlist)

p2 (cadr ptlist)

p3 (caddr ptlist)

)

(setq cen_r (3pc p1 p2 p3))

(setq ptmax (maxd-cir ptlist (car cen_r)))

(setq i 0)

(while (null (in1 ptmax (car cen_r) (cadr cen_r)))

(setq cen_r (4pc p1 p2 p3 ptmax))

(setq p1(car (caddr cen_r))

p2(cadr (caddr cen_r))

p3(caddr (caddr cen_r))

)

(setq ptmax (maxd-cir ptlist (car cen_r)))

(setq i (1+ i))

)

(list (car cen_r) (cadr cen_r) ptmax)

)

)

)

(defun make-circle (cen rad)

(entmake

(list

'(0 . "circle")

(cons 10 cen)

(cons 40 rad)

(cons 62 1)

)

)

)

(defun make-line (p q)

(entmake

(list

'(0 . "LINE")

(cons 10 p)

(cons 11 q)

)

)

)

;;以下代码来自晓东

;;定义取点函数----

(defun ssgetpoint (ss / i l a b c)

(setq i 0)

(if ss

(repeat (sslength ss)

(setq a (ssname ss i))

(setq i (1+ i))

(setq b (entget a))

(setq c (cdr (assoc 10 b)))

(setq l (cons c l))

)

)

(reverse l)

)

;;;

(defun mid (p1 p2)

(list

(* (+ (car p1) (car p2)) 0.5)

(* (+ (cadr p1) (cadr p2)) 0.5)

(* (+ (caddr p1) (caddr p2)) 0.5)

)

)

;;;判断点是否在圆内------------------------

(defun in1 (pt cen r)

(< (- (distance pt cen) r) 1e-8)

)

;;;判断点集是否在圆内----------------------

(defun in2 (ptl cen r / pts pt)

(setq pts ptl)

(while (and (setq pt (car pts))

(in1 pt cen r)

)

(setq pts (cdr pts))

)

(null pt)

)

;;;定义三点最小圆圆心及其半径,若是锐角三角

;;;形,则是其三点圆,否则是其最大边的直径圆

(defun 3pc (pa pb pc / D MIDPT)

(cond

( (in1 pc (setq midpt (mid pa pb)) (setq d (/ (distance pa pb) 2)))

(list midpt d (list pa pb pc))

)

( (in1 pa (setq midpt (mid pb pc)) (setq d (/ (distance pb pc) 2)))

(list midpt d (list pb pc pa))

)

( (in1 pb (setq midpt (mid pc pa)) (setq d (/ (distance pc pa) 2)))

(list midpt d (list pc pa pb))

)

(t

(3pcircle pa pb pc)

)

)

)

;;; 三点圆函数

(defun 3PCirCle(P0 P1 P2 / X0 Y0 X1 Y1 X2 Y2 DX1 DY1 DX2 DY2 D 2D C1 C2 CE)

(setqX0 (car P0)

Y0 (cadr P0)

X1 (car P1)

Y1 (cadr P1)

X2 (car P2)

Y2 (cadr P2)

DX1 (- X1 X0)

DY1 (- Y1 Y0)

DX2 (- X2 X0)

DY2 (- Y2 Y0)

)

(setq D (- (* DX1 DY2) (* DX2 DY1)))

(if (/= D 0.0)

(progn

(setq 2D (+ D D)

C1 (+ (* DX1 (+ X0 X1)) (* DY1 (+ Y0 Y1)))

C2 (+ (* DX2 (+ X0 X2)) (* DY2 (+ Y0 Y2)))

CE (List (/ (- (* C1 DY2) (* C2 DY1)) 2D)

(/ (- (* C2 DX1) (* C1 DX2)) 2D)

)

)

(list CE (distance CE P0) (list p0 p1 p2))

)

)

)

;;;定义四点的最小圆圆心半径,并返回三点坐标

(defun 4pc (p1 p2 p3 ptmax / pts mind minr r 4ps)

(setqpts (list (3pc p1 p2 ptmax)

(3pc p1 p3 ptmax)

(3pc p2 p3 ptmax)

)

)

(setq 4ps (list p1 p2 p3 ptmax))

(setq minr 1e308)

(foreach n pts

(setq r (cadr n))

(if(and (< r minr)

(in2 4ps (car n) r)

)

(setq mind n)

)

)

mind

)

;;定义求点集中离圆心最远的点的函数--------

(defun maxd-cir(ptl cen / pmax dmax d)

(setq dmax 0.0)

(foreach pt ptl

(if(> (setq d (distance pt cen)) dmax)

(setq dmax d

pmax pt

)

)

)

pmax

)

;;;随机增量法

(defun Mdesc (pts sup / s p c)

(if (setq s pts)

(progn

;;(setq p (GetRandomElementOf pts))

(setq p (car s))

(setq s (cdr s))

(setq c (mdesc s sup))

(if (Inside p c)

C

(mdesc s (cons p sup))

)

)

(Circle Sup)

)

)

;;;随机增量法

(defun Circle (Sup / n p1 p2 p3 CR)

(setq n (length sup))

(cond

( (= n 1)

(cons (car sup) 0)

)

( (= n 2)

(setq p1 (car sup))

(setq p2 (cadr sup))

(cons (mid p1 p2) (/ (distance p1 p2) 2))

)

( (= n 3)

(setq p1 (car sup))

(setq p2 (cadr sup))

(setq p3 (caddr sup))

(setq CR (3pCirCle p1 p2 p3))

(cons (car CR) (cadr CR))

)

(t nil)

)

)

(defun Inside (p C)

(if c

(< (- (distance p (car C)) (cdr C)) 1e-8)

)

)

cad生成最小包围盒lisp_cad生成最小包围盒lisp_点集的最小包围圆(用LISP求解)相关推荐

  1. 如何生成OBB(OrientedboundingBox)方向包围盒

    如何生成OBB(OrientedboundingBox)方向包围盒 转自:https://blog.csdn.net/qing101hua/article/details/53100112 评价:文章 ...

  2. LISP 圆孔标记_【CAD】〖30〗生成圆孔明细表

    [CAD][30]生成圆孔明细表 2018-09-19 [转载]原创为XDSoft AUTOCAD可以这样玩!!! 授人以鱼不如授人以渔!!! ★★如果在ACAD下,你工作中有需要把重复的劳动希望用插 ...

  3. cad自动填写页码lisp,CAD图纸页码的自动生成-农夫也玩CAD

    CAD图纸页码的自动生成 农夫也玩CAD 我们经常看到的文件页面不管是Word还是WPS都有页码标注,而且它都是由程序自动生成的,当你增删页面后页码会自动修正,偏偏这个号称功能强大的Auto CAD却 ...

  4. Bounds(包围盒)概述与AABB包围盒应用

    Bounds(包围盒)概述与应用 ==转载标明出处== 1.包围盒描述(摘至百度百科): 1.1 什么是包围盒?包围盒算法是一种求解离散点集最优包围空间的方法.基本思想是用体积稍大且特性简单的几何体( ...

  5. python生成订单号或生成任意序列

    python生成订单号或生成任意序列 示例代码: import time# 生成订单号 def get_order_code():# 年月日时分秒+time.time()的后7位order_no = ...

  6. python使用np.linspace函数生成均匀的浮点数列表实战:生成浮点数列表、生成浮点数列表(指定是否包含末尾值)

    python使用np.linspace函数生成均匀的浮点数列表实战:生成浮点数列表.生成浮点数列表(指定是否包含末尾值) 目录

  7. java 生成 防伪码,C#生成防伪码的思路及源码分享

    摘 要 1. 生成多个防伪码,防伪码的长度和个数由用户指定. 2. 防伪码由"0123456789ABCDEFGHJKLMNPQRSTUVWXYZ"字符组成,生成的防伪码不可以重复 ...

  8. Visual studio那些破事。。。(生成静态库、生成动态库、引用静态库、引用动态库)

    共4个小步骤,每个小步骤你都可以新建个VS解决方案,自己跟着步骤跑一下,windows怎么[生成静态库.生成动态库.引用静态库.引用动态库]你就基本明白了@! 文章目录 1.导出静态库.lib(add ...

  9. 平面点集的最小包围圆 hdu 3932

    最小覆盖圆算法地址:http://soft.cs.tsinghua.edu.cn/blog/?q=node/1066 平面点集的最小包围圆 1.           问题背景   考察固定在工作平台上 ...

最新文章

  1. mysql internal_MySQLInternal笔记
  2. exchange2003如何恢复邮件
  3. 学习java的知识体系路线
  4. osgearth入门图解-用VC++做一个地球出来
  5. Spring-AOP基础知识
  6. MyBatis创建SqlSession-有没有更好的拿到SqlSessionTemplate 的方法?
  7. Linux基础命令---apachectl
  8. Ae/Pr画面破损信号干扰插件包TV Distortion Bundle的5个不同效果插件
  9. python描述器 触发事件_Python描述器引导(转)
  10. 26.卷1(套接字联网API)---线程
  11. 所谓国产机:别的LINUX,要么无法安装,要么安装了跑不起来
  12. android camera调试打印信息,Android : 高通平台Camera调试
  13. 北京大学软件与微电子学院嵌入式系统工程系
  14. C语言 “百鸡问题”最优解
  15. Convex functions
  16. 推荐几个选择时间.日期的免费插件 js
  17. 全球及中国中线静脉插管行业研究及十四五规划分析报告
  18. 一位工作七年的Java工程师给毕业生的经验分享
  19. IO模块软件处理方案
  20. win7安装Winpcap4.12显示An error occurred while installing the NPF diver(0x00000430).

热门文章

  1. 无代码开发是什么,如何选择无代码平台?
  2. 数分面试:如何保证数据准确性?
  3. 江西省电子专题大赛考点讲解十一:CD4511 BCD码-七段译码器
  4. 关于constexpr与const
  5. 社会保障IC卡发卡方案
  6. 两年Java开发经验,裸辞之后筹备半年时间,重面阿里终于如愿拿到P6级offer [Java岗],你知道我是怎么走过来的吗?
  7. 程序员选择去国企好还是互联网好?身体好去互联网,不好就去国企
  8. c语言保留n位有效数字问题
  9. Linux中内部命令和外部命令
  10. 数学建模学习(43):多项式拟合详细讲解