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





网友答: 本帖最后由 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

网友答: 大海的胸怀,令人佩服!来自: Android客户端

网友答: 楼主的研究,另我等敬佩!

网友答: 好贴必须顶上去!!!

网友答: 高手!速度应该快很多!

网友答: 路过学习了

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

网友答: 这个挺好的!谢谢分享!

网友答: 感谢   非常感谢分享

网友答: 楼主厉害,赞
  • 上一篇:切地形剖面图lsp --成熟了20250322更: 可剖曲线按
  • 下一篇:没有了