从中心动画正弦波

时间:2014-12-10 13:19:13

标签: c animation math wolfram-mathematica data-visualization

我想要为正弦波设置动画,就好像它是从中心生成并向外移动(向左和向右)。

我从这个库开始:SISinusWaveView并进行了一些调整。目前我有这个天真的代码,用于根据X,相位和频率计算曲线的Y位置:

float width = view.width; float mid = width / 2;
float adjustedX = x < mid ? x : width - x;
float y = maxAmplitude * sinf(2 * M_PI *(adjustedX / mid) * frequency + phase);
// phase increases every frame

很明显,这会在正弦波中间产生一个锐角,如下所示:

sine-wave

我想这样做,因此动画的水平中心是平滑的曲线而不是锐角,同时保持动画水平对称。我该如何处理?任何有关实现这一目标的数学见解都值得赞赏。


修改

我试图实现@TheBigH建议,但是抛物线部分并没有无缝地继续正弦曲线。这是我尝试过的(在 Mathematica 上实现快速可视化):

amp = 10;
freq = 1.5;
phase = 0.5;
Z = 1;
plotSine = Plot[amp*Sin[freq*x + phase], {x, Z, 2 Pi}];
aPara = amp*freq*Cos[phase]/(2 Z);
bPara = 0;
cPara = amp*Sin[c] - aPara*Z^2;
plotPara = 
  Plot[aPara*x^2 + bPara*x + cPara, {x, -Z, Z }, 
   PlotRange -> {{-Z, Z}, {-20, 20}}];
Show[plotPara, plotSine, PlotRange -> {{-2 Pi, 2 Pi}, {-20, 20}}

结果如下:

enter image description here

改变抛物线的符号也不起作用:

enter image description here


编辑2

我现在看到问题是假设s(0) = p(Z)s'(0) = p'(Z);而不是s(z) = p(Z)s'(Z) = p'(Z)。移动正弦波使其准确地在抛物线结束处开始将解决问题,但是更方便地解决抛物线,例如s(z) = p(Z)s'(Z) = p'(Z),因为这将简化实现。这该怎么做?

enter image description here


编辑3

有关最终解决方案,请参阅此math.stackexchange.com answer

1 个答案:

答案 0 :(得分:2)

由于OP要求我详细说明,以下是我的回答。

大多数情况下,您正在绘制函数s(x) = a sin(bx + c),其中abc来自原始问题。稍后我们将把正弦曲线移动一些偏移Z,但是我现在将它从正弦曲线中移开,因为它会使数学复杂化。

新的抛物线部分将使用等式p(x) = Ax^2 + Bx + CABC是与ab和{不同的变量{1}})。

您希望两个方程式干净地连接,这意味着c。您还希望斜坡很好地连接起来,这样就没有角落。这意味着您还需要s(0) = p(Z)。此外,由于抛物线以原点为中心,s'(0) = p'(Z)

因此,如果您已经知道B = 0ACa <,则bc有两个联立方程式/ p>

Z

a sin( c ) = A Z^2 + C
ab cos( c ) = 2AZ

这为您提供了抛物线的等式,您可以在A = ab cos( c ) / (2Z) C = a sin (c) - A Z^2 -Z之间进行绘制。然后,您所要做的就是绘制正弦曲线,现在添加该偏移量。如果有任何不清楚的地方,请告诉我。

编辑:我看到正弦波也有垂直移位。这不会造成任何问题;只需将其留下即可将其添加到抛物线和最后的正弦波中。