2014-10-27 55 views
8

我正在尋找一種聰明的方式來遞增,然後遞減計數器變量。我希望計數器變量從低值開始增加,並向更高值增加。一旦達到較高值,計數器將遞減,直到達到較低值。一旦達到較低的值,計數器再次增加到更高的值......我想你明白了。我們如何增加然後遞減沒有條件的計數器?

我工作的AA canvas animation,我想使用一些小聰明,而無需使用if或其他條件測試:

這裏是處理計數器變量的條件邏輯:

incrementing = true 

foo = -> 

    length += 1 if incrementing 
    length -= 1 if not incrementing 

    incrementing = false if length > 100 
    incrementing = true if length < 1 

最初,我想我可以使用模數。但是,模除法只會將計數器重置爲較低的值 - 一旦計數器達到最高值,它不會使計數器遞減。

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 

我確定必須有一種方法來做到這一點,而不使用條件測試。假設底部值爲0,頂部值爲10,則該方法應輸出以下內容。

? = 0 
? = 1 
? = 2 
? = 3 
? = 4 
? = 5 
? = 6 
? = 7 
? = 8 
? = 9 
? = 8 
? = 7 
? = 6 
? = 5 
+1

'+ 1'需要一個完全沒有問題的解決方案,純粹是爲了讓你的代碼更漂亮。這就是我們學習CoffeeScript的原因。 – 2014-10-29 15:42:52

回答

15

首先讓我們看看一些波!

你好!

types of waves

你能找出符合你的需求嗎?

如果你猜對了Triangle Wave,你是對的!

三角波以均勻的斜率振盪,直到它遇到最小或最大值,然後斜率反轉。

兩件事情制定出在這裏:

  • 功能的起源將在波
  • 波振盪的中間開始從x-x

我們希望以0開始輸出並且僅包括正值

function triangle(t, a) { 
    return Math.abs(((t + a/2) % a) - a/2); 
} 

讓我們嘗試一下

for (var i=0; i<20; i++) { 
    console.log(i, triangle(i, 10)); 
} 

輸出

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 

所以,當我們調用triangle(i, 10)10是 「月經」。這告訴我們在重複之前我們想要在我們的函數中有多少步驟。

6一個時期將會給我們6個值,0, 1, 2, 3, 2, 1

4一個時期將會給我們4個值,0, 1, 2, 1

如果你想從0-9去,你會需要一段20

+0

這是鋸齒形的版本。可用於重置爲0 'function sawtooth(t,a){Math.abs(((t + a)%a)); }' – veganista 2016-08-02 14:02:42

2

這裏有一個:

(x&8)+(x&7)*((~x&8)/4-1) 

這將給你

0,1,2,3,4,5,6,7,8,7,6,5,4,3,2,1,0,1,... 

當然有實際上是有一個條件,只是被隱藏了的按位運算。

另一種可能性是三角波計數:

(x^((x&8)/-8))&7 

這確實

0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,0,... 

再有一個隱藏條件是翻轉位,當它中途得到。