本帖最后由 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楼高飞鸟大师给出了非常棒的程序,对样条曲线的效果更好
|