本帖最后由 llsheng_73 于 2023-10-25 11:01 编辑
首先“碎数”是与模相应的,比如需要取整到10、100、1000、50等,碎数其实是与模数相应的余数;
其次是余数的处理问题,根据需要可能采取“截尾”、“进一”、“四舍五入”、“四舍六入5分单双”等进行处理;
- (defun fixn(a n f / b c);;f=1,截尾;;f=2,进一;f=3,四舍五入;f=4,四舍六入单进双进不进
- (setq b(fix(/(rem a n)n 0.1))c(/ a n 1.))
- (cond((= f 1)(*(fix c)n))
- ((= f 2)(*(1+(fix c))n))
- ((= f 3)(*(fix(+ c 0.5))n))
- ((= f 4)(if(and(= b 5)(=(gcd(fix(/ a n 1.))2)1))
- (*(1+(fix c))n)
- (*(fix(+(fix c)(* b 0.1)))n)))
- ))
有了“碎数”的处理方法后,可以先计算出线图元整取后的长度,对于应该增长的,只需要修改止点坐标就行,对于应该缩短的就麻烦些,因为无法确定最后一个子段长度是否大于“碎数”,所以应该先在取整长度位置增加节点,再去除该节点之后所有点
另外,如果是样条曲线或样条拟合的线,一般无法直接修改至目标长度,需要进行多次逼近
只有直线最简单,根据起点、长度、方向计算出终点后直接修改就行 |