确定是等差数列,问题就简单了。
这个怎么解..我有点绕晕了..昨天看了下..画出来总是不对呢.. 本帖最后由 namezg 于 2018-7-27 14:43 编辑
你这种己知a,b,n本身就是不正确的,因为根据已知条件可推出中间段长度x=0.5*n*(a+b)
取不同的n值,x都对应一个固定值,而你画的直线中的lz不一定和这个固定值一样,所有已知条件过定义了。也能写出程序,但意义不大。程序如下:
;渐变分段--不推荐
(defun c:tt1 ( / en a b obj L x nx nd n d i x1 dist pt)
(vl-load-com)
(setvar "cmdecho" 0)
(command "_undo" "be")
(if (and
(setq en (car (entsel "\n请选择要分断的对象: ")))
(setq a (getreal "\n请输入第一段的长度: "))
(setq b (getreal "\n请输入最后一段的长度: "))
)
(progn
(setq obj (vlax-ename->vla-object en))
(setq L (vlax-curve-getDistAtParam obj (vlax-curve-getEndParam obj)));对象总长
(setq x (- L a b));中间段长度
;根据已知条件可推出
;等式① d=(b-a)/(n+1)
;等式② x=(a+d)+...(a+n*d)=n*a+(1+...n)*d=n*a+0.5*(n+1)*n*d
;将等式①代入等式②,x=n*a+0.5*(n+1)*n*(b-a)/(n+1)=n*a+0.5*n*(b-a)=n*a+0.5*n*b-0.5*n*a=0.5*n*a+0.5*n*b=0.5*n*(a+b)
;即x=0.5*n*(a+b)
(setq nx (/ x b))
(setq nd (/ x a))
(while (not (< nx (setq n (getint (strcat "\n请输入中间段的段数n (" (vl-princ-to-string nx) "<n<" (vl-princ-to-string nd) "): "))) nd))
(princ "\n段数n超出范围,请重新输入!")
)
(setq d (/ (- b a) (+ n 1)));等差数列的公差
(setq x1 (+ (* n a) (* 0.5 (+ n 1) n d)))
(setq i 0)
(if (= x x1)
(repeat (+ n 1)
(setq dist (+ a (* i d)))
(setq pt (vlax-curve-getPointAtDist obj dist))
(command "_.break" en "_non" (trans pt 0 1) "_non" "@")
(setq en (entlast))
(setq obj (vlax-ename->vla-object en))
(setq i (+ i 1))
)
(princ "\n无法分段,请重新输入段数n!")
)
)
)
(command "_undo" "e")
(setvar "cmdecho" 1)
(princ)
)
我建议改为已知直线总长度为L,第一段长度为a,直线分段段数为n(注意这个n不是指的中间段段数,而且指定直线被分段的总段数,n≥3),然后根据计算可得出等差数列的公差d=2*(L-n*a)/(n*(n-1)),然后程序获得各分段点进行分段。(b无需做为已知条件,这里b=a+(n-1)*d)
程序如下:
;渐变分段--推荐
(defun c:tt ( / en a n obj L d i dist pt)
(vl-load-com)
(setvar "cmdecho" 0)
(command "_undo" "be")
(if (and
(setq en (car (entsel "\n请选择要分断的对象: ")))
(setq a (getreal "\n请输入第一段的长度: "))
)
(progn
(while (not (>= (setq n (getint "\n请输入段数n(n≥3): ")) 3))
(princ "\n段数n超出范围,请重新输入!")
)
(setq obj (vlax-ename->vla-object en))
(setq L (vlax-curve-getDistAtParam obj (vlax-curve-getEndParam obj)));对象总长
;根据已知条件可推出
;L=a+(a+d)+......+(a+(n-1)*d)=n*a+(1+.....+(n-1))*d=n*a+0.5*(1+n-1)*(n-1)*d=n*a+0.5*n*(n-1)*d
;推出d=2*(L-n*a)/(n*(n-1))
(setq d (/ (* 2.0 (- L (* n a))) (* n (- n 1))));等差数列的公差
(setq i 0)
(repeat (- n 1)
(setq dist (+ a (* i d)))
(setq pt (vlax-curve-getPointAtDist obj dist))
(command "_.break" en "_non" (trans pt 0 1) "_non" "@")
(setq en (entlast))
(setq obj (vlax-ename->vla-object en))
(setq i (+ i 1))
)
)
)
(command "_undo" "e")
(setvar "cmdecho" 1)
(princ)
)
namezg 发表于 2018-7-26 14:52
你这种己知a,b,n本身就是不正确的,因为根据已知条件可推出中间段长度x=0.5*n*(a+b)
取不同的n值,x都是一 ...
等差数列很好理解呀..但定了AB就总算不对不知道哪里有问题.. namezg 发表于 2018-7-26 14:52
你这种己知a,b,n本身就是不正确的,因为根据已知条件可推出中间段长度x=0.5*n*(a+b)
取不同的n值,x都对应 ...
试了一下,改后的lsp完全可以使用,满足使用要求,感谢您~
表达的不清楚,烧了大神们不少脑细胞了,哈哈~
永不言弃 发表于 2018-7-26 15:49
兄弟这工具好像也不错,能分享一下? 内容很棒,感谢分享 namezg 发表于 2018-7-26 14:52
你这种己知a,b,n本身就是不正确的,因为根据已知条件可推出中间段长度x=0.5*n*(a+b)
取不同的n值,x都对应 ...
tt1程序,有时候在一定范围内,很多符合N取值的数据,输入后,报错;比如n满足条件5~12,输入6/7,可能出现错误
页:
1
[2]