luk*_*mas 8 javascript logic coffeescript
我正在寻找一种聪明的方法来递增然后递减计数器变量.我希望计数器变量从低值开始并递增,朝向更高的值.一旦达到较高值,计数器就会递减,直到它回到较低值.一旦达到较低值,计数器再次递增到更高的值......我想你明白了.
我正在制作一个画布动画,我想使用一些聪明,不使用if或其他条件测试:
这是处理计数器变量的条件逻辑:
incrementing = true
foo = ->
length += 1 if incrementing
length -= 1 if not incrementing
incrementing = false if length > 100
incrementing = true if length < 1
Run Code Online (Sandbox Code Playgroud)
最初,我以为我可以使用modulo.但是,模除法仅将计数器重置为较低值 - 一旦达到最高值,它不会递减计数器.
0 % 10 = 0
1 % 10 = 1
2 % 10 = 2
3 % 10 = 3
4 % 10 = 4
5 % 10 = 5
6 % 10 = 6
7 % 10 = 7
8 % 10 = 8
9 % 10 = 9
10 % 10 = 0
11 % 10 = 1
12 % 10 = 2
13 % 10 = 3
Run Code Online (Sandbox Code Playgroud)
我确信必须有一种方法可以在不使用条件测试的情况下完成此操作.假设底值为0且顶值为10,则该方法应输出以下内容.
? = 0
? = 1
? = 2
? = 3
? = 4
? = 5
? = 6
? = 7
? = 8
? = 9
? = 8
? = 7
? = 6
? = 5
Run Code Online (Sandbox Code Playgroud)
Tha*_*you 16
首先让我们来看看一些波浪!
你好挥手!

你能确定一个符合你需求的吗?
如果你猜到三角波,你是对的!
三角波以均匀的斜率振荡,直到达到最小值或最大值,然后斜率反转.
这里有两件事要做:
x那里振荡到-x我们想要开始输出,0只包含正值
function triangle(t, a) {
return Math.abs(((t + a/2) % a) - a/2);
}
Run Code Online (Sandbox Code Playgroud)
我们来试试吧
for (var i=0; i<20; i++) {
console.log(i, triangle(i, 10));
}
Run Code Online (Sandbox Code Playgroud)
产量
0 0
1 1
2 2
3 3
4 4
5 5
6 4
7 3
8 2
9 1
10 0
11 1
12 2
13 3
14 4
15 5
16 4
17 3
18 2
19 1
Run Code Online (Sandbox Code Playgroud)
所以,当我们调用triangle(i, 10)的10是"月经".这告诉我们在重复之前我们希望在函数中有多少步骤.
一段时间6会给我们6个值,0, 1, 2, 3, 2, 1
一段时间4会给我们4个价值观0, 1, 2, 1等
如果你想离开0-9,你需要一段时间20