首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >做正弦波更陡?

做正弦波更陡?
EN

Stack Overflow用户
提问于 2014-02-27 13:35:24
回答 7查看 7.9K关注 0票数 16

我写了一个小函数,当我在0到1之间放一个浮点数时,它给了我一个基于正弦波的值。我用它在游戏中使用勒普

代码语言:javascript
复制
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;
    }
}

效果很好..。但我想知道是否有一种改变正弦波的数学方法,这样我就可以使正弦波在中间变得更陡或更浅?在蓝色曲线下面的图中是正弦波,我想知道我是否能使它更像绿线。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2014-02-27 14:00:10

你已经显示的不是正弦波,正弦波的范围在-1和+1之间,你正在应用线性函数f(x) = (x+1)/2来改变这个范围。所以把另一个函数放在正弦和那个变换之间。

要改变形状,需要一个非线性函数.所以,这里有一个立方方程,你可以试试.

代码语言:javascript
复制
g(x) = Ax^3 + Bx^2 + Cx + D

D = 0
C = p
B = 3 - 3C
A = 1 - (B + C)

参数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之间),迭代应用该公式是混沌的。我从R·M·梅的人口波动模型中学到了这个想法,但是那是二次型的,我想要对称的,所以我需要一个三次函数。这里不太相关,也是个相当令人敬畏的想法。虽然你确实得到了混沌的波形,但这实际上意味着在放气方面存在巨大的问题--改变采样率,你就得到了一个完全不同的声音。不过,如果没有迭代,也许这会满足您的需要。

如果你用p在0.0到1.0之间迭代了足够多的时间,你就会得到一个方波,它的拐角有点圆角。

很可能您只需选择一个介于0.0到1.0之间的p值,应用该函数一次,然后应用您的函数来更改范围,您就可以得到想要的结果。

顺便说一句,已经有一条评论暗示着一份“宽松功能”的小抄。“放松”是动画中的一个术语,计算机动画软件经常为此使用Bezier曲线--与矢量图形软件经常使用的Bezier曲线相同。Bezier曲线以二次型和三次型两种形式出现,而三次型曲线则更为常见。所以这所做的可能没什么不同。然而,立方Bezier宽松提供了更多的控制-您可以控制“轻松-in”独立于“轻松-退出”,其中我的函数只提供一个参数。

票数 9
EN

Stack Overflow用户

发布于 2016-09-02 11:22:09

您可以在y(x) = 1-(1-x)^n时使用x = [0..1]函数作为转换函数。

您只需将x替换为sinus的绝对值,并向结果报告sinus的符号。这样你就可以通过增加n来调整窦斜率。所以你想要的是:

代码语言:javascript
复制
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) );
票数 7
EN

Stack Overflow用户

发布于 2020-05-07 09:45:14

您可以将正弦函数作为根使其更加陡峭(只对正值工作)。根越高,正弦越陡。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22070187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档