2014-10-27 16 views
8

Tôi đang tìm một cách thông minh để tăng và sau đó giảm biến số lượt truy cập. Tôi muốn biến số lượt truy cập bắt đầu với giá trị thấp và tăng dần, hướng tới giá trị cao hơn. Khi nó đạt đến giá trị cao hơn, bộ đếm sẽ giảm xuống cho đến khi nó đạt tới giá trị thấp hơn. Khi nó đạt đến giá trị thấp hơn, bộ đếm sẽ tăng trở lại với giá trị cao hơn ... Tôi nghĩ bạn sẽ có được điểm.Làm thế nào chúng ta có thể tăng và sau đó giảm một bộ đếm mà không có điều kiện?

tôi đang làm việc trên aa canvas animation nơi tôi muốn sử dụng một số thông minh, mà không sử dụng if hoặc các xét nghiệm khác có điều kiện:

Đây là logic có điều kiện để xử lý các biến truy cập:

incrementing = true 

foo = -> 

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

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

Ban đầu, tôi nghĩ rằng tôi có thể sử dụng modulo. Tuy nhiên, phân chia modulo chỉ đặt lại bộ đếm ngược về giá trị thấp hơn - nó không làm giảm bộ đếm khi nó đạt đến giá trị cao nhất.

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 

Tôi chắc chắn phải có cách để thực hiện việc này mà không sử dụng kiểm tra có điều kiện. Giả sử giá trị dưới cùng là 0 và giá trị cao nhất là 10, phương thức sẽ xuất ra như sau.

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

'+ 1' để cần giải pháp cho tổng số không có vấn đề, hoàn toàn làm cho mã của bạn đẹp hơn. Đây là lý do tại sao chúng ta học CoffeeScript. –

Trả lời

15

Trước tiên hãy xem một số wave!

Xin chào sóng!

types of waves

bạn có thể xác định một trong đó phù hợp với nhu cầu của bạn?

Nếu bạn đoán Triangle Wave, bạn nói đúng!

Sóng tam giác dao động với độ dốc đồng đều cho đến khi nó chạm một phút hoặc tối đa và sau đó dốc được đảo ngược.

Hai điều cần làm việc ra ở đây:

  • nguồn gốc của các chức năng sẽ bắt đầu vào giữa làn sóng
  • sóng dao động từ x để -x

Chúng tôi muốn để bắt đầu đầu ra tại 0 và chỉ bao gồm các giá trị dương

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

Hãy thử nó ra

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

Output

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 

Vì vậy, khi chúng ta gọi là triangle(i, 10) các 10 là "thời gian". Điều này cho chúng ta biết có bao nhiêu bước chúng ta muốn có trong chức năng của chúng ta trước khi nó lặp lại.

Một thời gian 6 sẽ cung cấp cho chúng tôi 6 giá trị, 0, 1, 2, 3, 2, 1

Một thời gian 4 sẽ cung cấp cho chúng tôi 4 giá trị, 0, 1, 2, 1 vv

Nếu bạn muốn đi từ 0-9, bạn sẽ cần một khoảng thời gian 20

+0

Đây là phiên bản răng cưa. Hữu ích khi đặt lại về 0 'hàm răng cưa (t, a) { trả về Math.abs (((t + a)% a)); } ' – veganista

2

Dưới đây là một:

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

sẽ cung cấp cho bạn

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

Tất nhiên thực sự có điều kiện trong đó, chỉ ẩn dưới dạng thao tác bitwise.

Một khả năng khác là một bộ đếm sóng tam giác:

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

mà không

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

một lần nữa có một điều kiện ẩn mà flips các bit khi nó được nửa chừng.

Các vấn đề liên quan