我想要为正弦波设置动画,就好像它是从中心生成并向外移动(向左和向右)。
我从这个库开始: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。
答案 0 :(得分:2)
由于OP要求我详细说明,以下是我的回答。
大多数情况下,您正在绘制函数s(x) = a sin(bx + c)
,其中a
,b
和c
来自原始问题。稍后我们将把正弦曲线移动一些偏移Z,但是我现在将它从正弦曲线中移开,因为它会使数学复杂化。
新的抛物线部分将使用等式p(x) = Ax^2 + Bx + C
(A
,B
和C
是与a
,b
和{不同的变量{1}})。
您希望两个方程式干净地连接,这意味着c
。您还希望斜坡很好地连接起来,这样就没有角落。这意味着您还需要s(0) = p(Z)
。此外,由于抛物线以原点为中心,s'(0) = p'(Z)
。
因此,如果您已经知道B = 0
,A
,C
和a
<,则b
,c
有两个联立方程式/ 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
之间进行绘制。然后,您所要做的就是绘制正弦曲线,现在添加该偏移量。如果有任何不清楚的地方,请告诉我。
编辑:我看到正弦波也有垂直移位。这不会造成任何问题;只需将其留下即可将其添加到抛物线和最后的正弦波中。