guosheyang 发表于 2023-1-6 19:10:13

封闭多段线节点序号向前后各续一个循环周期 不用if条件判断 让i连续变化求值的方法

本帖最后由 guosheyang 于 2023-1-6 19:13 编辑

给朋友们分享封闭多段线节点序号向前后各续一个循环周期 不用if条件判断 让i连续变化求值的方法 ,如有更好的方法请反馈
(progn
(setq l '(0 1 2 3 4 5 6));节点序号表
(setq n(length l))       ;节点总数
(setq l2(append l l l));节点序号拓展表
(nth (+ i n) l2)         ;i的取值范围(-(length l)) 到 (1-(* 2 (length l)))
;例如
   ;当i为6时 (nth (+ 6 n) l2) 的值是6
   ;当i为7时 (nth (+ 7 n) l2)的值是0
   ;当i为8时 (nth (+ 8 n) l2)的值是1
   ;当i为9时 (nth (+ 9 n) l2)的值是2
   ;当i为13时(nth (+ 13 n)l2)的值是6
;反方向
    ;当i为-1时(nth (+ -1 n)l2)的值是6
    ;当i为-2时(nth (+ -2 n)l2)的值是5
    ;当i为-7时(nth (+ -7 n)l2)的值是0
)




guosheyang 发表于 2023-1-7 18:28:00

本帖最后由 guosheyang 于 2023-1-7 18:31 编辑

这个只是针对闭合多段线 的圆角 倒角角度标注等目的写的其实就是解决点表第一点   最后一点的上一点上上点下一点下下点 的衔接问题    不需要那么多   前后重叠一个整表一般都用不到一般不超过两个列表项
如果要无限循环 还是要用你的那个公式但我是没遇到过需要无限循环的情况 :lol

guosheyang 发表于 2023-1-7 18:35:02

guosheyang 发表于 2023-1-7 18:28
这个只是针对闭合多段线 的圆角 倒角角度标注等目的写的其实就是解决点表第一点   最后一点的上一点...

另外 这样短的代码 一两行 没必要单独搞一个函数   搞成函数可能反而慢些   直接放到主函数中有些内容 不必每次都运行   那样可能还快点

kkq0305 发表于 2023-1-6 22:24:24

xyp1964 发表于 2023-1-6 20:50
;; (abc '(0 1 2 3 4 5 6) 13) → 6
(defun abc (lst n / nn)
(setq nn (length lst)n (rem n nn))


加个取绝对值
;; (abc '(0 1 2 3 4 5 6) 13) → 6
(defun abc (lst n / nn)
(setq nn (length lst)n (rem (abs n) nn))
(nth n lst)
)

飞雪神光 发表于 2023-1-6 20:26:48

xyp1964 发表于 2023-1-6 20:50:30

;; (abc '(0 1 2 3 4 5 6) 13) → 6
(defun abc (lst n / nn)
(setq nn (length lst)n (rem n nn))
(nth n lst)
)

guosheyang 发表于 2023-1-6 23:54:18

kkq0305 发表于 2023-1-6 22:24
加个取绝对值
;; (abc '(0 1 2 3 4 5 6) 13) → 6
(defun abc (lst n / nn)


逆向回溯时得到的值 不对头看能否改动到与对应的值相同?

guosheyang 发表于 2023-1-6 23:55:23

xyp1964 发表于 2023-1-6 20:50
;; (abc '(0 1 2 3 4 5 6) 13) → 6
(defun abc (lst n / nn)
(setq nn (length lst)n (rem n nn))


院长逆向回溯时得到的值 好不对头哟   还需要修改下

llsheng_73 发表于 2023-1-7 16:01:54

(defun tt(lst n / m)(nth(rem(+ n(setq m(length lst)))m)lst))

中国梦 发表于 2023-1-8 07:13:49

谢谢楼主分享
页: [1] 2
查看完整版本: 封闭多段线节点序号向前后各续一个循环周期 不用if条件判断 让i连续变化求值的方法