如何沿 x 轴移动 canvas 构建的波形
How to move a canvas built wave form along an x axis
我画了一个可以被用户操作的波形。波形很容易在 canvas 的 y 轴上下移动,但我很难沿 x 轴移动波形。
HTML:
<div id="oscilloscope">
<canvas id="canvas" width=400 height=300></canvas>
<div class="dials">
<section class="model-15">
<div class="checkbox">
<input id="sin" type="checkbox" value="sin">
<label></label>
</div>
</section>
<div id="focus">
<input id="blur" class="knob" data-width="50" data-fgColor="#AA3939" data-min="0" data-max="15" data-displayPrevious=true value="0">
<div class="label_focus">Focus</div>
</div>
<div id="intensity">
<input id="intense" class="knob" data-width="50" data-fgColor="#AA7439" data-min="1" data-max="9" data-displayPrevious=true value="9">
<div class="label_intensity">Intensity</div>
</div>
<div id="xmove">
<input id="xpos" class="knob" data-width="50" data-min="-20" data-max="420" data-displayPrevious=true value="200" data-fgColor="#F890C8">
<div class="label_xpos">X-Pos</div>
</div>
<div id="ymove">
<input id="ypos" class="knob" data-width="50" data-min="-20" data-max="320" data-displayPrevious=true value="150" data-fgColor="#ad648c">
<div class="label_ypos">Y-Pos</div>
</div>
<div id="volts">
<input id="sin-f" class="knob" data-width="100" data-min="1" data-max="50" data-displayPrevious=true value="5">
<div class="label_volts">Volts/Div</div>
</div>
<div id="time_delay">
<input id="period" class="knob" data-width="100" data-fgColor="#FF4D4D" data-min="1" data-max="25" data-displayPrevious=true value="1">
<div class="label_delay">Delay</div>
</div>
<div id="volts_ch2">
<input id="amps" class="knob" data-width="100" data-min="1" data-displayPrevious=true value="5" data-fgColor="#66cc66">
<div class="label_volts2">Volts/Div</div>
</div>
使用我一直在处理的 JS 代码的主要元素。
function drawWave() {
ctx.strokeStyle = 'rgba(25, 255, 50, 0.8)'; //sets waveform stroke colour & Size
console.log ("sinFreq: " + sinFrequency);
example = intensity.value/10;
ctx.globalAlpha= example;
ctx.shadowBlur = fuzz.value;
// omega = 2 * pi * f
function getOmega(frequency) {
return 2 * Math.PI * frequency;
}
// pixel = 2 * Math.PI * frequency * period / canvas.width
function getPixel(frequency) {
return getOmega(frequency) * period / (cx.value/.5);
}
var sin_pixel = getPixel(sinFrequency);
function getWavePoints(count, pixel, triangle_func) {
var points = []; //points array
for (var i = 0, len = count; i < len; i++) {
points.push(triangle_func(pixel * i) * factor + yPosition); //this moves the wavform along y axis, but it is an array
}
return points;
}
// 下面是 x-pos 移动应该起作用的地方
function drawPoints(pixel, triangle_func) {
var path = getWavePoints(canvas.width, pixel, triangle_func);
ctx.beginPath();
ctx.moveTo(0, path[0]);
for (var i = 0, len = path.length; i < len; i++) {
ctx.lineTo(i, path[i]);
}
ctx.stroke();
}
if (isDrawSin) {
drawPoints(sin_pixel, function(x){return Math.sin(x);});
}
}
function getFactor() { //the function adjusts the wave height (amplitude)
return canvas.height / amp;
}
我想左右移动整个波形但不增加波形的频率,这样做时。
你想做的是改变你的周期函数的phase
。通常,周期函数如下所示:
y = amplitude * f(2 * pi * frequency + phase) + yoffset
... 其中 f
是 sin
、cos
等。上下移动时,您更改 yoffset
,就像您使用 [=16] =] 变量。可以通过更改 phase
值来实现从左到右移动图形。
我画了一个可以被用户操作的波形。波形很容易在 canvas 的 y 轴上下移动,但我很难沿 x 轴移动波形。
HTML:
<div id="oscilloscope">
<canvas id="canvas" width=400 height=300></canvas>
<div class="dials">
<section class="model-15">
<div class="checkbox">
<input id="sin" type="checkbox" value="sin">
<label></label>
</div>
</section>
<div id="focus">
<input id="blur" class="knob" data-width="50" data-fgColor="#AA3939" data-min="0" data-max="15" data-displayPrevious=true value="0">
<div class="label_focus">Focus</div>
</div>
<div id="intensity">
<input id="intense" class="knob" data-width="50" data-fgColor="#AA7439" data-min="1" data-max="9" data-displayPrevious=true value="9">
<div class="label_intensity">Intensity</div>
</div>
<div id="xmove">
<input id="xpos" class="knob" data-width="50" data-min="-20" data-max="420" data-displayPrevious=true value="200" data-fgColor="#F890C8">
<div class="label_xpos">X-Pos</div>
</div>
<div id="ymove">
<input id="ypos" class="knob" data-width="50" data-min="-20" data-max="320" data-displayPrevious=true value="150" data-fgColor="#ad648c">
<div class="label_ypos">Y-Pos</div>
</div>
<div id="volts">
<input id="sin-f" class="knob" data-width="100" data-min="1" data-max="50" data-displayPrevious=true value="5">
<div class="label_volts">Volts/Div</div>
</div>
<div id="time_delay">
<input id="period" class="knob" data-width="100" data-fgColor="#FF4D4D" data-min="1" data-max="25" data-displayPrevious=true value="1">
<div class="label_delay">Delay</div>
</div>
<div id="volts_ch2">
<input id="amps" class="knob" data-width="100" data-min="1" data-displayPrevious=true value="5" data-fgColor="#66cc66">
<div class="label_volts2">Volts/Div</div>
</div>
使用我一直在处理的 JS 代码的主要元素。
function drawWave() {
ctx.strokeStyle = 'rgba(25, 255, 50, 0.8)'; //sets waveform stroke colour & Size
console.log ("sinFreq: " + sinFrequency);
example = intensity.value/10;
ctx.globalAlpha= example;
ctx.shadowBlur = fuzz.value;
// omega = 2 * pi * f
function getOmega(frequency) {
return 2 * Math.PI * frequency;
}
// pixel = 2 * Math.PI * frequency * period / canvas.width
function getPixel(frequency) {
return getOmega(frequency) * period / (cx.value/.5);
}
var sin_pixel = getPixel(sinFrequency);
function getWavePoints(count, pixel, triangle_func) {
var points = []; //points array
for (var i = 0, len = count; i < len; i++) {
points.push(triangle_func(pixel * i) * factor + yPosition); //this moves the wavform along y axis, but it is an array
}
return points;
}
// 下面是 x-pos 移动应该起作用的地方
function drawPoints(pixel, triangle_func) {
var path = getWavePoints(canvas.width, pixel, triangle_func);
ctx.beginPath();
ctx.moveTo(0, path[0]);
for (var i = 0, len = path.length; i < len; i++) {
ctx.lineTo(i, path[i]);
}
ctx.stroke();
}
if (isDrawSin) {
drawPoints(sin_pixel, function(x){return Math.sin(x);});
}
}
function getFactor() { //the function adjusts the wave height (amplitude)
return canvas.height / amp;
}
我想左右移动整个波形但不增加波形的频率,这样做时。
你想做的是改变你的周期函数的phase
。通常,周期函数如下所示:
y = amplitude * f(2 * pi * frequency + phase) + yoffset
... 其中 f
是 sin
、cos
等。上下移动时,您更改 yoffset
,就像您使用 [=16] =] 变量。可以通过更改 phase
值来实现从左到右移动图形。