使正弦波更陡峭?

Guy*_*ito 14 math trigonometry

我写了一个小函数,当我放入一个介于0和1之间的浮点数时,它给出了一个基于正弦波的值.我正在使用它来渲染游戏中的东西.

public static class Utilities 
{
    public static float SineMe(float prop)
    {
        float output = (prop*180f)-90f;

        output = Mathf.Sin(output*Mathf.Deg2Rad);

        output = (output+1f)/2f;

        return output;
    }
}
Run Code Online (Sandbox Code Playgroud)

它工作得很好..但我想知道是否有一种改变正弦波的数学方法,所以我可以让它在中间"更陡"或"更浅"?在下图中,蓝色曲线是正弦波,我想知道我是否可以使它更像绿线.

在此输入图像描述

Ste*_*314 7

您所展示的内容并非真正正弦 - 正弦范围介于-1和+1之间.您正在应用线性函数f(x) = (x+1)/2来更改该范围.所以在正弦和变换之间放置另一个函数.

要更改形状,您需要非线性函数.所以,这是你可能尝试的立方方程式......

g(x) = Ax^3 + Bx^2 + Cx + D

D = 0
C = p
B = 3 - 3C
A = 1 - (B + C)
Run Code Online (Sandbox Code Playgroud)

参数p应该被赋予介于0.0和9.0之间的值.如果它是1.0,则g(x)是标识函数(输出是未修改的输入).如果值介于0.0和1.0之间,则会使您的正弦波"变胖"(将其从0.0推向1.0或-1.0),这正是您所需要的.

我曾经"设计"了这个函数,作为获得"分形波形"的一种方法.使用p介于1.0和9.0之间(特别是介于3.0和6.0之间)的值,该公式的迭代应用是混乱的.我从RM May的人口波动建模混沌函数中偷走了这个想法,但这是一个二次方 - 我想要一些对称的东西,所以我需要一个三次函数.这里并不是真正相关,而是一个非常令人敬畏的想法.虽然你肯定会得到混乱的波形,但这实际上意味着存在巨大的问题 - 改变采样率并且你得到一个非常不同的声音.尽管如此,如果没有迭代,也许这会给你所需要的东西.

如果迭代次数足够多,p在0.0和1.0之间,则最终得到一个带有略圆角的方波.

很可能你只需选择0.0到1.0之间的p值,应用该函数一次,然后应用你的函数来改变范围,你就会得到你想要的.

顺便说一句,已经有一条评论暗示了"缓和功能"的备忘单."Easing"是来自动画的术语,计算机动画软件通常使用Bezier曲线来实现此目的 - 矢量图形软件经常使用的Bezier曲线.贝塞尔曲线有二次和三次变量,立方体更常见.所以这样做可能并没有那么不同.然而,立方贝塞尔缓动为您提供了更多控制 - 您可以独立于"缓出"控制"缓入",其中我的函数仅提供一个参数.


Mot*_*tla 6

您可以将y(x) = 1-(1-x)^n函数 whenx = [0..1]用作变换函数。

您只需用x您的绝对值替换sinus并报告结果的符号sinus即可。通过这种方式,您可以通过增加 来调整正弦斜率n。所以你想要的是这个:

float sinus = Mathf.Sin(output*Mathf.Deg2Rad);
int sign = (sinus >= 0 ? 1 : -1);

int n = 4; // slope parameter

float waveform = sign * ( 1-Mathf.Pow(1-Mathf.Abs(sinus), n) );
Run Code Online (Sandbox Code Playgroud)