精确快速求spline线的最小点及最大点
本帖最后由 lgx9612 于 2014-7-27 13:56 编辑之前确因有一贴妙作,发贴不过10贴的不给看,故在不了解版规的情况下发了不少图片充数,确有炫耀和广告之嫌.在此实在是不好意思,虽写出几个小程序但本人笨拙,写的代码量很多,就不一一展示了.对本人来说计算最小点,最大点虽教程到处都可找到,但spline线对我来说是小有困难,费了我很大的心思.下面就spline线的最小点及最大点给出如下代码,请大家批评指正.(;计算最小点,最大点主程式,spline线
;ss_minbox_lgx是选集
;.......................略
(setq nx_lgx (sslengthss_minbox_lgx))
(repeat nx_lgx
(setq partname_lgx(ssname ss_minbox_lgx (setq nx_lgx (1- nx_lgx))))
(setq typepart_lgx (cdr (assoc 0 (entget partname_lgx))))
(if (/= typepart_lgx "SPLINE")
(progn
;不是spline线的计算
)
(calspline_lgx partname_lgx)
)
)
)
(defun calspline_lgx(partname_lgx)
(setq pl-temp_min_point nil)
(setq pl-temp_max_point nil)
(setq p_lgx nil)
(setq lowest nil)
(setq bbb (entget partname_lgx))
(while (/= (assoc 10bbb) nil)
(setq p1_lgx (assoc 10bbb))
(setq p_lgx (cons (cdr p1_lgx) p_lgx))
(setq bbb (vl-remove p1_lgx bbb))
)
(setq pl-temp_min_point (apply 'mapcar (cons 'min p_lgx)))
(setq pl-temp_max_point (apply 'mapcar (cons 'max p_lgx)))
(setq pl-temp_min_point (list (- (car pl-temp_min_point) 3)(- (cadr pl-temp_min_point) 3)))
(setq pl-temp_max_point (list (+ (car pl-temp_max_point) 3)(+ (cadr pl-temp_max_point) 3)))
(setq vla-object(vlax-ename->vla-object partname_lgx))
(progn
(setq pl_min_point pl-temp_min_point)
(setq pl_max_point pl-temp_max_point)
(setq zzl (/ (- (car pl_max_point)(car pl_min_point)) 10))
(setqgivenPnt (list (car pl_min_point)(cadr pl_max_point)))
(setq type_lgx "y")
(calculate_lgx )
(setq y2 topnt)
)
(progn
(setq pl_min_point pl-temp_min_point)
(setq pl_max_point (list (car pl-temp_max_point)(cadr pl-temp_min_point)))
(setq zzl (/ (- (car pl_max_point)(car pl_min_point)) 10))
(setqgivenPnt (list (car pl_min_point)(cadr pl_max_point)))
(setq type_lgx "y" )
(calculate_lgx)
(setq y1 topnt)
)
(progn
(setq pl_min_point pl-temp_min_point)
(setq pl_max_point (list (car pl-temp_min_point)(cadr pl-temp_max_point)))
(setq zzl (/ (- (cadr pl_max_point)(cadr pl_min_point)) 10))
(setqgivenPnt pl_min_point)
(setq type_lgx "x" )
(calculate_lgx )
(setq x1 topnt)
)
(progn
(setq pl_min_point (list (car pl-temp_max_point)(cadr pl-temp_min_point)))
(setq pl_max_point pl-temp_max_point)
(setq zzl (/ (- (cadr pl_max_point)(cadr pl_min_point)) 10))
(setqgivenPnt pl_min_point)
(setq type_lgx "x" )
(calculate_lgx )
(setq x2 topnt)
)
(setq llpoint (list (car x1) (cadr y1)))
(setq urpoint (list (car x2) (cadr y2)))
)
(defun calculate_lgx()
(setq lowest nil)
(while (>= zzl 0.02)
(repeat 11
(setq topnt (vlax-curve-getClosestPointTo vla-object givenPnt ))
;;;(command "line" givenPnt topnt "")
(if (or (>= lowest (distancegivenPnt topnt)) (= lowest nil))
(progn
(setq lowest (distancegivenPnt topnt))
(setq lowestpoint givenPnt)
)
)
(if (= type_lgx "y")
(setqgivenPnt (list (+ (car givenPnt) zzl)(cadr pl_max_point)))
(setqgivenPnt (list (car pl_min_point)(+ (cadr givenPnt) zzl)))
)
)
(if (= type_lgx "y")
(setqgivenPnt (list (- (car lowestpoint) zzl) (cadr pl_max_point)))
(setqgivenPnt (list (car pl_min_point)(- (cadr lowestpoint) zzl)))
)
(setq zzl (/ zzl 5))
)
(setq topnt (vlax-curve-getClosestPointTo vla-object lowestpoint ));;;givenPnt改为 lowestpoint
(setq lowest nil)
) 本帖最后由 lucas_3333 于 2016-12-3 14:40 编辑
Gu_xl 发表于 2014-7-17 14:18 static/image/common/back.gif
什么叫做最小点和最大点啊,有哪方面的应用呢?科普一下吧 什么是最小点?x最小还丫最小。没看明白 不好意思!是最小包容盒子的最小点和最大点. 楼主,你是哪里人啊,写"程式"的人好少哦 lgx9612 发表于 2014-7-16 20:30
不好意思!是最小包容盒子的最小点和最大点.
你用了whi|e,是不是逼近法。G版写的那个更简洁 本帖最后由 lgx9612 于 2014-7-27 13:59 编辑
(;计算spline线最小包容盒子的左下角点和右上角点
;ss_minbox_lgx是选集
;.....................省略
(setq nx_lgx (sslengthss_minbox_lgx))
(repeat nx_lgx
(setq partname_lgx(ssname ss_minbox_lgx (setq nx_lgx (1- nx_lgx))))
(setq typepart_lgx (cdr (assoc 0 (entget partname_lgx))));;;加上这行,这行少写了
(if (/= typepart_lgx "SPLINE")
(progn
;不是spline线的计算
)
(calspline_lgx partname_lgx)
)
)
)
(defun calspline_lgx(partname_lgx)
(setq pl-temp_min_point nil)
(setq pl-temp_max_point nil)
(setq p_lgx nil)
(setq lowest nil)
(setq bbb (entget partname_lgx))
(while (/= (assoc 10bbb) nil)
(setq p1_lgx (assoc 10bbb))
(setq p_lgx (cons (cdr p1_lgx) p_lgx))
(setq bbb (vl-remove p1_lgx bbb))
)
(setq pl-temp_min_point (apply 'mapcar (cons 'min p_lgx)))
(setq pl-temp_max_point (apply 'mapcar (cons 'max p_lgx)))
(setq pl-temp_min_point (list (- (car pl-temp_min_point) 3)(- (cadr pl-temp_min_point) 3)))
(setq pl-temp_max_point (list (+ (car pl-temp_max_point) 3)(+ (cadr pl-temp_max_point) 3)))
(setq vla-object(vlax-ename->vla-object partname_lgx))
(progn
(setq pl_min_point pl-temp_min_point)
(setq pl_max_point pl-temp_max_point)
(setq zzl (/ (- (car pl_max_point)(car pl_min_point)) 10))
(setqgivenPnt (list (car pl_min_point)(cadr pl_max_point)))
(setq type_lgx "y")
(calculate_lgx )
(setq y2 topnt)
)
(progn
(setq pl_min_point pl-temp_min_point)
(setq pl_max_point (list (car pl-temp_max_point)(cadr pl-temp_min_point)))
(setq zzl (/ (- (car pl_max_point)(car pl_min_point)) 10))
(setqgivenPnt (list (car pl_min_point)(cadr pl_max_point)))
(setq type_lgx "y" )
(calculate_lgx)
(setq y1 topnt)
)
(progn
(setq pl_min_point pl-temp_min_point)
(setq pl_max_point (list (car pl-temp_min_point)(cadr pl-temp_max_point)))
(setq zzl (/ (- (cadr pl_max_point)(cadr pl_min_point)) 10))
(setqgivenPnt pl_min_point)
(setq type_lgx "x" )
(calculate_lgx )
(setq x1 topnt)
)
(progn
(setq pl_min_point (list (car pl-temp_max_point)(cadr pl-temp_min_point)))
(setq pl_max_point pl-temp_max_point)
(setq zzl (/ (- (cadr pl_max_point)(cadr pl_min_point)) 10))
(setqgivenPnt pl_min_point)
(setq type_lgx "x" )
(calculate_lgx )
(setq x2 topnt)
)
(setq llpoint (list (car x1) (cadr y1)))
(setq urpoint (list (car x2) (cadr y2)))
)
(defun calculate_lgx()
(setq lowest nil)
(while (>= zzl 0.02)
(repeat 11
(setq topnt (vlax-curve-getClosestPointTo vla-object givenPnt ))
;;;(command "line" givenPnt topnt "")
(if (or (>= lowest (distancegivenPnt topnt)) (= lowest nil))
(progn
(setq lowest (distancegivenPnt topnt))
(setq lowestpoint givenPnt)
)
)
(if (= type_lgx "y")
(setqgivenPnt (list (+ (car givenPnt) zzl)(cadr pl_max_point)))
(setqgivenPnt (list (car pl_min_point)(+ (cadr givenPnt) zzl)))
)
)
(if (= type_lgx "y")
(setqgivenPnt (list (- (car lowestpoint) zzl) (cadr pl_max_point)))
(setqgivenPnt (list (car pl_min_point)(- (cadr lowestpoint) zzl)))
)
(setq zzl (/ zzl 5))
)
(setq topnt (vlax-curve-getClosestPointTo vla-object lowestpoint ))
(setq lowest nil)
) 能介绍下思路吗? 风树 发表于 2014-7-16 20:47 static/image/common/back.gif
能介绍下思路吗?
通过曲线自身的参数求出能够框住曲线的外框来,再用外框边上取点求出距离曲线最近点,四边用同样的方法分别求出最大x,y最小x,y即可. lgx9612 发表于 2014-7-16 21:17 static/image/common/back.gif
通过曲线自身的参数求出能够框住曲线的外框来,再用外框边上取点求出距离曲线最近点,四边用同样的方 ...
很好,
另外的这个方法也许可行:
原曲线端点+极值点排序后确定y方向上的最大最小值,
原曲线旋转90度后用同样的方式确定原来x方向上的最大最小值