从中心动画正弦波

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

我从这个库开始: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

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

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

编辑

我试图实现@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}}

结果如下:

改变抛物线的符号也不是很有效:

编辑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)因为这会简化实施.这该怎么做?

编辑3

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

最佳答案 由于OP要求我详细说明,这是我的回答.

最常见的是,你正在绘制函数s(x)= a sin(bx c),其中a,b和c来自原始问题.稍后我们将把正弦曲线移动一些偏移Z但是我现在将它从正弦曲线中移开,因为它会使数学复杂化.

新的抛物线部分将具有等式p(x)= Ax ^ 2 Bx C(A,B和C是不同于a,b和c的变量).

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

因此,鉴于您已经知道a,b,c和Z,您有两个A,C联立方程

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

要么

A = ab cos( c ) / (2Z)
C = a sin (c) - A Z^2

这将为您提供抛物线的方程式,您可以在-Z和Z之间绘制.然后您需要做的就是绘制正弦曲线,现在添加该偏移量.如果有任何不清楚的地方,请告诉我.

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

点赞