使正弦波更陡峭?

时间:2014-02-27 13:35:24

标签: math sine

我写了一个小函数,当我放入一个介于0和1之间的浮点数时,它给出了一个基于正弦波的值。我在游戏中将它用于lerp周围的东西。

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;
    }
}

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

enter image description here

6 个答案:

答案 0 :(得分: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)

参数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. May的人口波动建模混沌函数中偷走了这个想法,但这是一个二次方 - 我想要一些对称的东西,所以我需要一个三次函数。这里并不是真正相关,而是一个非常令人敬畏的想法。虽然你肯定会得到混乱的波形,但这实际上意味着存在很大的问题 - 改变采样率并且你得到一个非常不同的声音。但是,如果没有迭代,也许这会给你你需要的东西。

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

你最有可能只选择0.0到1.0之间的p值,应用该功能一次,然后应用你的功能来改变范围,你会得到你想要的。

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

答案 1 :(得分:4)

您可以在y(x) = 1-(1-x)^n时使用x = [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) );

答案 2 :(得分:0)

我正在寻找类似的功能,不是整个正弦,而只是一半的时间。 我碰到了Logistic函数:

<style>
.header_wrapper {
    position: relative;
    margin: 0;
    padding: 0;
}

 .parkbg { 
    position: relative;
    top: 0; 
    margin: 0;
    padding: 0;
    outline: none;
 }

 .parkbg img { 
     width: 100%; 
   }

 .parkbackground {
   padding: 0;
   margin: 0;
   top: 0;
   padding: 0;
   height: 100%;
   position: absolute;
   z-index: 100;
   width: 100%;
   }
</style>

          <div class="header_wrapper">
            <div class="parkbg"><img src="https://example.com/images/parkbench.jpg'"/></div>
            <div class="parkbackground" width="100%">
                <div style="width: 300px; float: left; margin: 0; padding: 0 0 0 12px;"><p id="logoHeader"><a style="text-decoration: none; outline: none; color: #cfc" href="http://example.com">jch</span><span style="color: #fff; text-decoration: underline;">webdev</span></a></p>
                <p class="viewinbrowser">Message mangled? <a href="https://example.com/a18/">Click here to view in your browser</a>.</p>
                </div>  
                <div style="width: 286px; height: 100%; float: left;"> <p style="text-align: right; padding: 8px 12px 0px 0; margin: 0; color: #fff;" >
                   <a id="header_phone" href="tel:123456789">(123) 123-4567</a></p>
                    <div class="index">
                      <h3>NEWSLETTER</h3>
                      <p>April 2018</p>                  
                      <hr />    
                      <ul>
                        <li style=""><a href="#2">SPRING CLEANING</a>
                          <p><span>Every Site gets cluttered.</span> And today it matters, both for your security and for your search presence. You need to conduct regular inventories of your site to make sure everything is where it's supposed to be and to get rid of what's not supposed to be there.</p></li>
                        <li style="">                            </li>                          
                       </ul>
                </div>       
            </div>
          </div>

参见https://en.wikipedia.org/wiki/Logistic_function 适合我

答案 3 :(得分:0)

您可以根植正弦函数使其更陡峭(仅适用于正值)。根数越高,正弦越陡。

enter image description here

答案 4 :(得分:0)

Graph of a steeper sine wave function

我发现了一个更陡峭的正弦波(0..1)的妙招。

f(x) = cos(sin(x)^3)^10

如果需要(-1..1):

2 * (f(x) - 0.5)

答案 5 :(得分:0)

关于

sign(sin(x))*sqrt(abs(sin(x))

https://www.desmos.com/calculator/5nn34xqkfr

enter image description here