pkg.re/essentialkaos/ek.10@v12.41.0+incompatible/easing/bounce.go (about)

     1  package easing
     2  
     3  // ////////////////////////////////////////////////////////////////////////////////// //
     4  //                                                                                    //
     5  //                         Copyright (c) 2022 ESSENTIAL KAOS                          //
     6  //      Apache License, Version 2.0 <https://www.apache.org/licenses/LICENSE-2.0>     //
     7  //                                                                                    //
     8  // ////////////////////////////////////////////////////////////////////////////////// //
     9  
    10  // BounceIn accelerating from zero velocity
    11  // https://easings.net/#easeInBounce
    12  func BounceIn(t, b, c, d float64) float64 {
    13  	if t > d {
    14  		return c
    15  	}
    16  
    17  	return c - BounceOut(d-t, 0.0, c, d) + b
    18  }
    19  
    20  // BounceOut Decelerating to zero velocity
    21  // https://easings.net/#easeOutBounce
    22  func BounceOut(t, b, c, d float64) float64 {
    23  	if t > d {
    24  		return c
    25  	}
    26  
    27  	t /= d
    28  
    29  	switch {
    30  	case t < 1/2.75:
    31  		return c*(7.5625*t*t) + b
    32  	case t < 2/2.75:
    33  		t -= 1.5 / 2.75
    34  		return c*(7.5625*t*t+0.75) + b
    35  	case t < 2.5/2.75:
    36  		t -= 2.25 / 2.75
    37  		return c*(7.5625*t*t+0.9375) + b
    38  	}
    39  
    40  	t -= 2.625 / 2.75
    41  	return c*(7.5625*t*t+0.984375) + b
    42  }
    43  
    44  // BounceInOut acceleration until halfway, then deceleration
    45  // https://easings.net/#easeInOutBounce
    46  func BounceInOut(t, b, c, d float64) float64 {
    47  	if t > d {
    48  		return c
    49  	}
    50  
    51  	if t < d/2 {
    52  		return BounceIn(t*2, 0.0, c, d)*0.5 + b
    53  	}
    54  
    55  	return BounceOut(t*2-d, 0.0, c, d)*0.5 + c*0.5 + b
    56  }