2012-09-03 81 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) 

在theta = 0這會給-1。由於theta命中0.5你會得到一個,但隨着theta增加從那裏Math.abs(theta - 0.5)將不斷增加,因此ke會繼續下降和下降。

你想要做的是使用一些模塊化算術來保持它在一個範圍內。

我打得並修改爲:

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

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

這樣做是做了模數,使價值去0-4和0-4,然後,重複(一種fo鋸齒)。減2使其重複-2到+2。以此絕對值使它從2跳到0到2,然後減1以得到好的-1到1的三角波。

我的小提琴也減少我也使圖形更清晰可見。 :)

編輯補充:

的原因,與其他問題的功能不工作是他說有,他的pos是cylcing變量從0到1(雖然我不感覺它很清楚地解釋)。

+0

你有沒有機會知道如何減小鋸齒波的範圍呢?這個三角形很好,我一直試圖在-1和1之間取得範圍,但無法弄清楚。謝謝你的幫助! – networkprofile

+0

並感謝清除關於自行車變量,我沒有注意到 – networkprofile

+0

如果你看看公式如何工作,它應該顯而易見。對於鋸齒,你要去0到4,因爲你正在做'mod 4'。所以mod值是你將在你的輸出中獲得的範圍。如果你想要的範圍是2(-1到+1)的大小,那麼只需將它加入到'mod 2'。那麼減法就是將波移到正確的垂直位置。所以如果你有0到2,那麼你只需要減去1就可以得到你想要的。即'(theta%2)-1' – Chris