2012-09-03 6 views
1

열린 차트로 삼각형과 톱니파 모양을 그리는 데 정말 어려움을 겪고 있습니다. 수식은 the answer in this post입니다. 이 나는 ​​삼각형이 무엇을 :삼각형과 톱니 모양의 웨이브를 형성

var myArray = []; 
    var myVals = []; 
    var mytrin = []; 
    ti = 2.0 * Math.PI * (880/44100); 
    theta = 0; 
    for(i = 0; i <500; i++){ 
     myArray.push(i); 
     var ke = value = (1.0 - Math.abs(theta - 0.5) * 4); 
     mytrin.push(ke); 
     theta = theta + ti; 
    } 

가 여기 online demo입니다. 톱니에 대해 같은 일에 대해

:

var myArray = []; 
var myVals = []; 
var mytrin = []; 
ti = 2.0 * Math.PI * (880/44100); 
theta = 0; 
for(i = 0; i <1000; i++){ 
    myArray.push(i); 
    var ke = theta*2-1; 
    mytrin.push(ke); 
    theta = theta + ti; 
} 

그리고 here's the demo.

무엇이 잘못 되었습니까?

답변

1

문제가 발생했습니다. ke입니다. 당신은 이것을 가지고 있습니다 :

(1.0 - Math.abs(theta - 0.5) * 4) 

시타 = 0이면 -1이됩니다. 테타가 0.5에 도달하면 당신은 하나까지 올라갈 것이지만, 거기에서 theta가 증가함에 따라 Math.abs(theta - 0.5)은 계속 증가 할 것이고, 따라서 케는 계속 내려 가고 내려갈 것입니다.

당신이 원하는 것은 모듈 식의 알고리즘을 사용하여 바운드 범위 내에서 유지하는 것입니다.

내가 연주하고 그것을 수정 한 :

1-Math.abs((theta%4)-2); 

http://jsfiddle.net/chrisvenus/tMHR8/

이것이 않는 것은이 값이 다음 0-4 반복을 0-4 가서 확인하기 위해 계수를 수행 (일종의 fo sawtooth). 2를 빼면 -2에서 +2가 반복됩니다. 이것의 abs를 취하면 2에서 0으로 바운스 된 다음 1을 빼고 -1에서 1 삼각형 파를 얻습니다.

내 피들을 사용하면 그래프가 더 잘 보이도록 줄일 수 있습니다. :)

편집 추가 :

다른 질문에서 기능이 그렇게하지 불구하고 (그의 pos가 0에서 1로 cylcing 변수가 있음이 명시 그가 작동하지 않는 이유를 그것이 매우 명확하게 설명되어 있다고 느낀다.)

+0

혹시 톱날의 범위를 줄이는 방법을 알고 계시나요? 삼각형은 훌륭하지만 -1에서 1 사이의 범위를 얻으려고했지만 그 점을 이해할 수는 없습니다. 당신의 도움을 주셔서 감사합니다! – networkprofile

+0

사이클링 변수에 대해 알아 봤지만 고마워했습니다. – networkprofile

+0

수식이 어떻게 작동하는지 살펴보면 분명히 분명해야합니다. 톱니파는 0에서 4가 될 것입니다. 왜냐하면 'mod 4'를하고 있기 때문입니다. 따라서 mod 값은 출력 결과를 얻는 범위입니다. 범위를 2 (-1에서 +1)의 크기로하려면 'mod 2'로 변경하십시오. 뺄셈은 웨이브를 올바른 수직 위치로 옮기는 것입니다. 따라서 0에서 2이면 원하는 것을 얻기 위해 1을 빼면됩니다. 즉''(theta % 2) -1' – Chris