commonMain.ru.casperix.math.curve.float32.CurveUnion2f.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of math Show documentation
Show all versions of math Show documentation
Simple set of geometric and other types
package ru.casperix.math.curve.float32
import ru.casperix.math.vector.float32.Vector2f
import kotlinx.serialization.Serializable
@Serializable
class CurveUnion2f(val first: ParametricCurve2f, val second: ParametricCurve2f) : ParametricCurve2f {
private val firstLength = first.length()
private val secondLength = second.length()
private val length = firstLength + secondLength
override fun length(): Float {
return length
}
override fun invert(): CurveUnion2f {
return CurveUnion2f(second.invert(), first.invert())
}
private fun getPart(t: Float): Pair {
val position = t * length
return if (position <= firstLength) {
Pair(first, position / firstLength)
} else {
Pair(second, (position - firstLength) / secondLength)
}
}
override fun divide(t: Float): Pair {
val (curve, s) = getPart(t)
val (left, right) = curve.divide(s)
return if (curve == first) {
Pair(left, right + second)
} else {
Pair(first + left, right)
}
}
override fun getPosition(t: Float): Vector2f {
val (curve, s) = getPart(t)
return curve.getPosition(s)
}
override fun getTangent(t: Float): Vector2f {
val (curve, s) = getPart(t)
return curve.getTangent(s)
}
override fun getNormal(t: Float): Vector2f {
val (curve, s) = getPart(t)
return curve.getNormal(s)
}
}