求最小包围框(二分法)
本帖最后由 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 于 2019-6-18 17:09 编辑
这是我的程序:
这个是我测试的dwg文件,发现用楼主的方法,有很多都不是很正确。
红色的是我求出的。
出现:no function definition: nil ,是因为没加载楼主的lisp 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 大海的胸怀,令人佩服! 楼主的研究,另我等敬佩! 好贴必须顶上去!!! 高手!速度应该快很多! 路过学习了 求出外围凸壳,按边转90度以内,这样不需要旋转实体,仅点运算 这个挺好的!谢谢分享! 感谢 非常感谢分享 楼主厉害,赞