tryhi 发表于 2016-4-25 03:05:02

求最小包围框(二分法)

本帖最后由 tryhi 于 2016-5-2 16:32 编辑


;;以下是应用例子
(defun c:tt (/ ls)
(setq ls(try-getbox-min (ssget)))
(command "pline" "_non"(car ls)"_non"(cadr ls)"_non"(caddr ls)"_non"(cadddr ls) "c")
)找了下求选择集最小包围框,发现很多人都在用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楼高飞鸟大师给出了非常棒的程序,对样条曲线的效果更好



highflybird 发表于 2016-4-29 16:49:44

本帖最后由 highflybird 于 2019-6-18 17:09 编辑

这是我的程序:

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


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

xzklk 发表于 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

shh1980 发表于 2016-4-25 05:50:58

大海的胸怀,令人佩服!

USER2128 发表于 2016-4-25 08:24:15

楼主的研究,另我等敬佩!

xtjd 发表于 2016-4-25 10:50:28

好贴必须顶上去!!!

xiaolong1487 发表于 2016-4-25 11:52:08

高手!速度应该快很多!

wudi 发表于 2016-4-25 12:53:52

路过学习了

ivde 发表于 2016-4-25 13:43:14

求出外围凸壳,按边转90度以内,这样不需要旋转实体,仅点运算

434939575 发表于 2016-4-25 17:58:46

这个挺好的!谢谢分享!

H-浩浩-H 发表于 2016-4-25 20:00:23

感谢   非常感谢分享

jiasui924521 发表于 2016-4-25 22:26:10

楼主厉害,赞
页: [1] 2 3 4 5 6
查看完整版本: 求最小包围框(二分法)