All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.ru.casperix.math.interpolation.float32.InterpolateFloatFunction.kt Maven / Gradle / Ivy

package ru.casperix.math.interpolation.float32

import ru.casperix.math.geometry.fPI
import kotlin.math.*

typealias InterpolateTypeFunctionf = (Type, Type, Float) -> Type
typealias InterpolateFloatFunction = (Float, Float, Float) -> Float

/**
 * 	x= [0 ; 1]
 *
 * 	x = 0.0
 * 	value  grow from a to b
 * 	x = 0.5
 * 	value low from b to a
 * 	x = 1f
 */
val parabolaABAInterpolatef: InterpolateFloatFunction = { a: Float, b: Float, x: Float ->
	val v = if (x < 0.5) {
		x
	} else {
		1f - x
	}
	a + b * sqrt(v * 2f)
}

val linearInterpolatef: InterpolateFloatFunction = { a: Float, b: Float, x: Float ->
	a * (1f - x) + b * x
}


val cosineInterpolatef: InterpolateFloatFunction = { a: Float, b: Float, x: Float ->
	val ft = x * fPI
	val f = (1f - cos(ft)) * 0.5f
	a * (1f - f) + b * f
}


val hermiteInterpolatef: InterpolateFloatFunction = { a: Float, b: Float, x: Float ->
	a + (b - a) * (3f - 2f * x) * x * x
}

/**
 * @source https://spicyyoghurt.com/tools/easing-functions
 */

val easeInQuadf: InterpolateFloatFunction = { a: Float, b: Float, t: Float ->
	val c = b - a
	c * t * t + a
}

val easeOutQuadf: InterpolateFloatFunction = { a: Float, b: Float, t: Float ->
	val c = b - a
	-c * t * (t - 2) + a
}

val easeInOutQuadf: InterpolateFloatFunction = { a: Float, b: Float, t: Float ->
	val c = b - a
	val dt = t * 2f

	if (dt < 1f) {
		c / 2 * dt * dt + a
	} else {
		-c / 2 * ((dt - 1f) * (dt - 3f) - 1f) + a
	}
}

val easeInCubicf: InterpolateFloatFunction = { a: Float, b: Float, t: Float ->
	val c = b - a
	c * t * t * t + a
}

val easeOutCubicf: InterpolateFloatFunction = { a: Float, b: Float, t: Float ->
	val c = b - a
	val dt = t - 1f
	c * (dt * dt * dt + 1) + a
}

val easeInOutCubicf: InterpolateFloatFunction = { a: Float, b: Float, t: Float ->
	val t1 = t * 2f
	val c = b - a

	if (t1 < 1f) {
		c / 2 * t1 * t1 * t1 + a
	} else {
		val t2 = t1 - 2f
		c / 2 * (t2 * t2 * t2 + 2) + a
	}
}

val easeInQuarticf: InterpolateFloatFunction = { a: Float, b: Float, t: Float ->
	val c = b - a
	c * t * t * t * t + a
}

val easeOutQuarticf: InterpolateFloatFunction = { a: Float, b: Float, t: Float ->
	val c = b - a
	val dt = t - 1f
	c * (dt * dt * dt * dt - 1) + a
}

val easeInOutQuarticf: InterpolateFloatFunction = { a: Float, b: Float, t: Float ->
	val t1 = t * 2f
	val c = b - a

	if (t1 < 1f) {
		c / 2 * t1 * t1 * t1 * t1 + a
	} else {
		val t2 = t1 - 2f
		c / 2 * (t2 * t2 * t2 * t2 - 2) + a
	}
}

val easeInQuinticf: InterpolateFloatFunction = { a: Float, b: Float, t: Float ->
	val c = b - a
	c * t * t * t * t * t + a
}

val easeOutQuinticf: InterpolateFloatFunction = { a: Float, b: Float, t: Float ->
	val c = b - a
	val dt = t - 1f
	c * (dt * dt * dt * dt * dt + 1) + a
}

val easeInOutQuinticf: InterpolateFloatFunction = { a: Float, b: Float, t: Float ->
	val t1 = t * 2f
	val c = b - a

	if (t1 < 1f) {
		c / 2 * t1 * t1 * t1 * t1 * t1 + a
	} else {
		val t2 = t1 - 2f
		c / 2 * (t2 * t2 * t2 * t2 * t2 + 2) + a
	}
}

val easeInOutElasticf: InterpolateFloatFunction = { b: Float, a1: Float, t: Float ->
	val c = a1 - b

	val s: Float
	val p = 0.3f * 1.5f
	var a = c
	if (t == 0f) {
		b
	} else {
		val t1 = t * 2f
		if (t1 == 2f) {
			b + c
		} else {

			if (a < c.absoluteValue) {
				a = c
				s = p / 4
			} else {
				s = p / (2 * fPI) * asin(c / a)
			}
			val t2 = t1 - 1f
			if (t1 < 1) {
				-.5f * (a * 2f.pow(10 * t2) * sin((t2 - s) * (2 * fPI) / p)) + b
			} else {
				a * 2f.pow(-10 * t2) * sin((t2 - s) * (2 * fPI) / p) * .5f + c + b;
			}
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy