本帖最后由 Gu_xl 于 2012-2-18 20:34 编辑  
cabinsummer 发表于 2012-2-18 18:30   
呵呵,确实是数学问题。QJCHEN和highflybird应该能解决  
Spline的最小包围框可以通过精度拟合逼近! 
下面是我的求任何物体的最小包围框通用函数:
  - ;;;(gxl-GetRealBox e1 d) 获取物体真实实体外矩形框,d为拟合逼近Spline最小长度
 
 - ;;参数 e1 图元名或Vla对象 d = Spline最小拟合间距
 
 - (defun gxl-GetRealBox  (E1 D / OBJ MINPOINT MAXPOINT DD PTS LEN)
 
 -   (if (= 'ENAME (type e1))
 
 -     (setq obj (vlax-ename->vla-object e1)) ;_ 转换图元名
 
 -     (setq obj e1)
 
 -     )
 
 -   (cond        ((= "AcDbSpline" (vla-get-ObjectName obj))
 
 -           (setq        len (vlax-curve-getDistAtParam
 
 -                       obj
 
 -                       (vlax-curve-getEndParam obj))
 
 -                 )
 
 -           (if (or (equal d 0 1e-6)
 
 -                   (> (/ len d) 1000)
 
 -                   )
 
 -             (setq d (/ len 1000.))
 
 -             )
 
 -           (setq        dd  d
 
 -                 pts (list (vlax-curve-getStartPoint obj))
 
 -                                )
 
 -           (while (< dd len)
 
 -             (setq pts (cons (vlax-curve-getPointAtDist obj dd) pts)
 
 -                   dd  (+ dd d)
 
 -                   )
 
 -             )
 
 -           (cons (vlax-curve-getendPoint obj) pts)
 
 -           (list        (apply 'mapcar (cons 'min pts))
 
 -                 (apply 'mapcar (cons 'max pts)))
 
 -           )
 
 -         (t
 
 -          (vla-GetBoundingBox obj 'minpoint 'maxpoint) ;_ 取得包容图元的最大点和最小点
 
 -          (setq minpoint (vlax-safearray->list minpoint)) ;_ 把变体数据转化为表
 
 -          (setq maxpoint (vlax-safearray->list maxpoint)) ;_ 把变体数据转化为表
 
 -          (list minpoint maxpoint)
 
 -          )
 
 -         )
 
 -   )
 
  
  
 |