我想为正弦波设置动画,就好像它是从中心生成并向外(向左和向右)移动一样。
我从这个库开始: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
,那么您就有了 A
、C
的两个联立方程, c
和 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
和 Z
之间绘制。然后您所要做的就是绘制正弦曲线,现在添加该偏移量。如果有任何不清楚的地方,请告诉我。
编辑:我看到正弦波也有垂直偏移。这不会造成任何问题;刚开始时将其省略,最后将其添加到抛物线和正弦波中。
关于c - 从中心动画正弦波,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27402063/