本帖最后由 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)
- )
- )
- )
|