明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 14223|回复: 52

[源码] 求最小包围框(二分法)

    [复制链接]
发表于 2016-4-25 03:05:02 | 显示全部楼层 |阅读模式
本帖最后由 tryhi 于 2016-5-2 16:32 编辑

  1. ;;以下是应用例子
  2. (defun c:tt (/ ls)
  3.   (setq ls(try-getbox-min (ssget)))
  4.   (command "pline" "_non"(car ls)"_non"(cadr ls)"_non"(caddr ls)"_non"(cadddr ls) "c")
  5. )
找了下求选择集最小包围框,发现很多人都在用lee-mac的一个函数,LM:minboundingbox
注:见地址http://lee-mac.com/minboundingbox.html
这个函数的原理是将选集通过N次选旋转,然后求其每一次的包围盒,最后得出最小那个
这个函数存在几个问题
1、先对选择集进行了复制,不知道为何要复制,直接旋转最后恢复速度不是更快
2、旋转了180度,即一个派,其实对于矩形这种上下左右对称的图形,只需要旋转90度,也就是里面有一半运算是多余的
3、采用了定量递增求最近值而不是采用二分法,lee-mac的例子中转了100次才得出0.01派的精度,即使我们优化到90度,也要求50次才能到0.01派的精度,如果采取2分法,循环30次,就可以到0.00001精度,提高了N个数量级

现对其以上存在的几个问题进行优化(其实是整个函数全部重写),速度、精度都提高了N倍,
其实这类函数论坛应该也很多,但是用二分法的却没有看到,二分法的速度跟精度,想必大家都了解。










注:附件里面的try-getbox函数为了应用在选择集的时候能够最大限度提高速度,采取的一次性变量来计算,没有使用表,所以代码很长,不喜欢的可以用lee-mac的LM:objlstboundingbox函数代替,比较简练



续:22楼高飞鸟大师给出了非常棒的程序,对样条曲线的效果更好



本帖子中包含更多资源

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

x

评分

参与人数 6明经币 +8 金钱 +20 收起 理由
hubeiwdlue + 1 很给力!
xyp1964 + 3 赞一个!
vectra + 1
zctao1966 + 1 神马都是浮云
USER2128 + 1 很给力!
lucas_3333 + 1 + 20 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2016-4-29 16:49:44 | 显示全部楼层
本帖最后由 highflybird 于 2019-6-18 17:09 编辑

这是我的程序:

这个是我测试的dwg文件,发现用楼主的方法,有很多都不是很正确。
红色的是我求出的。


出现:no function definition: nil ,是因为没加载楼主的lisp

本帖子中包含更多资源

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

x

评分

参与人数 4明经币 +4 金钱 +20 收起 理由
hubeiwdlue + 1
1028882406@qq.c + 1
tryhi + 1 很给力!
lucas_3333 + 1 + 20 神马都是浮云

查看全部评分

回复 支持 3 反对 0

使用道具 举报

发表于 2022-10-21 02:32:21 | 显示全部楼层
highflybird 发表于 2016-4-29 16:49
这是我的程序:

这个是我测试的dwg文件,发现用楼主的方法,有很多都不是很正确。

我不想总是输入精度的数值,就在你的代码里加了这么一段怎么不会听话?能帮我解答一下吗?谢谢!
(setq sel (ssget '((0 . "POINT,LWPOLYLINE,LINE,SPLINE,ARC,CIRCLE,ELLIPSE,INSERT"))))  ;select curve or point
  (initget 7)
(progn
                                 (if (not jingdu_ever) (progn (setq jingdu_ever 100)) (setq n jingdu_ever))
                                 (setq n (getint (strcat "\n请输入分割曲线的精度(合理值100 to 2000)<" (rtos jingdu_ever) ">")))
                                 (if (not n) (setq n jingdu_ever) (setq jingdu_ever n))
                         )
   (if sel                                                      
    (progn
发表于 2016-4-25 05:50:58 来自手机 | 显示全部楼层
大海的胸怀,令人佩服!来自: Android客户端
发表于 2016-4-25 08:24:15 | 显示全部楼层
楼主的研究,另我等敬佩!
发表于 2016-4-25 10:50:28 | 显示全部楼层
好贴必须顶上去!!!
发表于 2016-4-25 11:52:08 | 显示全部楼层
高手!速度应该快很多!
发表于 2016-4-25 12:53:52 | 显示全部楼层
路过学习了
发表于 2016-4-25 13:43:14 来自手机 | 显示全部楼层
求出外围凸壳,按边转90度以内,这样不需要旋转实体,仅点运算
发表于 2016-4-25 17:58:46 | 显示全部楼层
这个挺好的!谢谢分享!
发表于 2016-4-25 20:00:23 | 显示全部楼层
感谢   非常感谢分享
发表于 2016-4-25 22:26:10 | 显示全部楼层
楼主厉害,赞
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 06:52 , Processed in 0.178233 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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