c - 从中心动画正弦波

标签 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最终解决方案。

最佳答案

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

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

新的抛物线部分将有方程 p(x) = Ax^2 + Bx + C(ABC 是不同于abc 的变量。

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

因此,如果您已经知道 ab,那么您就有了 AC 的两个联立方程, cZ

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

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

这给出了抛物线方程,您在 -ZZ 之间绘制。然后您所要做的就是绘制正弦曲线,现在添加该偏移量。如果有任何不清楚的地方,请告诉我。

编辑:我看到正弦波也有垂直偏移。这不会造成任何问题;刚开始时将其省略,最后将其添加到抛物线和正弦波中。

关于c - 从中心动画正弦波,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27402063/

相关文章:

java - 仅使用一个递归函数计算 1 到 n 的阶乘之和

c - 如何编译已经用 GCC 预处理过的 C 代码?

c - 通过 sizeof() 的结果打印 const char 数组

c - 从 sscanf 读取的数字为 0

CSS::before 和::after 动画到按钮的中心,但只有::after 结束在中心

javascript - Flash Canvas 响应动画大小

php - 基于字符集的固定长度的所有字符串组合

java:如何实现数学解析

flutter - 为什么我的 flutter 动画过渡没有发生?

algorithm - 计算窗框(修剪)的有效使用