Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
de.bixilon.kotlinglm.VectorRelational.kt Maven / Gradle / Ivy
package de.bixilon.kotlinglm
import de.bixilon.kotlinglm.vec1.Vec1
import de.bixilon.kotlinglm.vec1.Vec1bool
import de.bixilon.kotlinglm.vec1.Vec1i
import de.bixilon.kotlinglm.vec2.Vec2
import de.bixilon.kotlinglm.vec2.Vec2bool
import de.bixilon.kotlinglm.vec2.Vec2i
import de.bixilon.kotlinglm.vec3.Vec3
import de.bixilon.kotlinglm.vec3.Vec3bool
import de.bixilon.kotlinglm.vec3.Vec3i
import de.bixilon.kotlinglm.vec4.Vec4
import de.bixilon.kotlinglm.vec4.Vec4bool
import de.bixilon.kotlinglm.vec4.Vec4i
import kotlin.math.abs
/* only for floating points
https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
https://randomascii.wordpress.com/2012/01/11/tricks-with-the-floating-point-format/
https://www.ibm.com/developerworks/library/j-math2/index.html
*/
interface Vec1Relational {
fun equals(a: Vec1, b: Vec1, epsilon: Float): Boolean = abs(a.x - b.x) <= epsilon
fun equals(a: Vec1, b: Vec1, epsilon: Vec1, res: Vec1bool = Vec1bool()): Vec1bool {
res.x = abs(a.x - b.x) <= epsilon.x
return res
}
fun notEquals(a: Vec1, b: Vec1, epsilon: Float): Boolean = abs(a.x - b.x) > epsilon
fun notEquals(a: Vec1, b: Vec1, epsilon: Vec1, res: Vec1bool = Vec1bool()): Vec1bool {
res.x = abs(a.x - b.x) > epsilon.x
return res
}
fun equals(a: Vec1, b: Vec1, maxUlps: Int): Boolean = a.x.isEqual(b.x, maxUlps)
fun equals(a: Vec1, b: Vec1, maxUlps: Vec1i, res: Vec1bool = Vec1bool()): Vec1bool {
res.x = a.x.isEqual(b.x, maxUlps.x)
return res
}
fun notEquals(a: Vec1, b: Vec1, maxUlps: Int): Boolean = !a.x.isEqual(b.x, maxUlps)
fun notEquals(a: Vec1, b: Vec1, maxUlps: Vec1i, res: Vec1bool = Vec1bool()): Vec1bool {
res.x = !a.x.isEqual(b.x, maxUlps.x)
return res
}
}
interface Vec2Relational {
fun equals(a: Vec2, b: Vec2, epsilon: Float): Boolean = abs(a.x - b.x) <= epsilon && abs(a.y - b.y) <= epsilon
fun equals(a: Vec2, b: Vec2, epsilon: Vec2, res: Vec2bool = Vec2bool()): Vec2bool {
res.x = abs(a.x - b.x) <= epsilon.x
res.y = abs(a.y - b.y) <= epsilon.y
return res
}
fun notEquals(a: Vec2, b: Vec2, epsilon: Float): Boolean = abs(a.x - b.x) > epsilon || abs(a.y - b.y) > epsilon
fun notEquals(a: Vec2, b: Vec2, epsilon: Vec2, res: Vec2bool = Vec2bool()): Vec2bool {
res.x = abs(a.x - b.x) > epsilon.x
res.y = abs(a.y - b.y) > epsilon.y
return res
}
fun equals(a: Vec2, b: Vec2, maxUlps: Int): Boolean = a.x.isEqual(b.x, maxUlps) && a.y.isEqual(b.y, maxUlps)
fun equals(a: Vec2, b: Vec2, maxUlps: Vec2i, res: Vec2bool = Vec2bool()): Vec2bool {
res.x = a.x.isEqual(b.x, maxUlps.x)
res.y = a.y.isEqual(b.y, maxUlps.y)
return res
}
fun notEquals(a: Vec2, b: Vec2, maxUlps: Int): Boolean = !a.x.isEqual(b.x, maxUlps) || !a.y.isEqual(b.y, maxUlps)
fun notEquals(a: Vec2, b: Vec2, maxUlps: Vec2i, res: Vec2bool = Vec2bool()): Vec2bool {
res.x = !a.x.isEqual(b.x, maxUlps.x)
res.y = !a.y.isEqual(b.y, maxUlps.y)
return res
}
}
interface Vec3Relational {
fun equals(a: Vec3, b: Vec3, epsilon: Float): Boolean = abs(a.x - b.x) <= epsilon && abs(a.y - b.y) <= epsilon && abs(a.z - b.z) <= epsilon
fun equals(a: Vec3, b: Vec3, epsilon: Vec3, res: Vec3bool = Vec3bool()): Vec3bool {
res.x = abs(a.x - b.x) <= epsilon.x
res.y = abs(a.y - b.y) <= epsilon.y
res.z = abs(a.z - b.z) <= epsilon.z
return res
}
fun notEquals(a: Vec3, b: Vec3, epsilon: Float): Boolean = abs(a.x - b.x) > epsilon || abs(a.y - b.y) > epsilon || abs(a.z - b.z) > epsilon
fun notEquals(a: Vec3, b: Vec3, epsilon: Vec3, res: Vec3bool = Vec3bool()): Vec3bool {
res.x = abs(a.x - b.x) > epsilon.x
res.y = abs(a.y - b.y) > epsilon.y
res.z = abs(a.z - b.z) > epsilon.z
return res
}
fun equals(a: Vec3, b: Vec3, maxUlps: Int): Boolean = a.x.isEqual(b.x, maxUlps) && a.y.isEqual(b.y, maxUlps) && a.z.isEqual(b.z, maxUlps)
fun equals(a: Vec3, b: Vec3, maxUlps: Vec3i, res: Vec3bool = Vec3bool()): Vec3bool {
res.x = a.x.isEqual(b.x, maxUlps.x)
res.y = a.y.isEqual(b.y, maxUlps.y)
res.z = a.z.isEqual(b.z, maxUlps.z)
return res
}
fun notEquals(a: Vec3, b: Vec3, maxUlps: Int): Boolean = !a.x.isEqual(b.x, maxUlps) || !a.y.isEqual(b.y, maxUlps) || !a.z.isEqual(b.z, maxUlps)
fun notEquals(a: Vec3, b: Vec3, maxUlps: Vec3i, res: Vec3bool = Vec3bool()): Vec3bool {
res.x = !a.x.isEqual(b.x, maxUlps.x)
res.y = !a.y.isEqual(b.y, maxUlps.y)
res.z = !a.z.isEqual(b.z, maxUlps.z)
return res
}
}
interface Vec4Relational {
fun equals(a: Vec4, b: Vec4, epsilon: Float): Boolean = abs(a.x - b.x) <= epsilon && abs(a.y - b.y) <= epsilon && abs(a.z - b.z) <= epsilon && abs(a.w - b.w) <= epsilon
fun equals(a: Vec4, b: Vec4, epsilon: Vec4, res: Vec4bool = Vec4bool()): Vec4bool {
res.x = abs(a.x - b.x) <= epsilon.x
res.y = abs(a.y - b.y) <= epsilon.y
res.z = abs(a.z - b.z) <= epsilon.z
res.w = abs(a.w - b.w) <= epsilon.w
return res
}
fun notEquals(a: Vec4, b: Vec4, epsilon: Float): Boolean = abs(a.x - b.x) > epsilon || abs(a.y - b.y) > epsilon || abs(a.z - b.z) > epsilon || abs(a.w - b.w) > epsilon
fun notEquals(a: Vec4, b: Vec4, epsilon: Vec4, res: Vec4bool = Vec4bool()): Vec4bool {
res.x = abs(a.x - b.x) > epsilon.x
res.y = abs(a.y - b.y) > epsilon.y
res.z = abs(a.z - b.z) > epsilon.z
res.w = abs(a.w - b.w) > epsilon.w
return res
}
fun equals(a: Vec4, b: Vec4, maxUlps: Int): Boolean = a.x.isEqual(b.x, maxUlps) && a.y.isEqual(b.y, maxUlps) && a.z.isEqual(b.z, maxUlps) && a.w.isEqual(b.w, maxUlps)
fun equals(a: Vec4, b: Vec4, maxUlps: Vec4i, res: Vec4bool = Vec4bool()): Vec4bool {
res.x = a.x.isEqual(b.x, maxUlps.x)
res.y = a.y.isEqual(b.y, maxUlps.y)
res.z = a.z.isEqual(b.z, maxUlps.z)
res.w = a.w.isEqual(b.w, maxUlps.w)
return res
}
fun notEquals(a: Vec4, b: Vec4, maxUlps: Int): Boolean = !a.x.isEqual(b.x, maxUlps) || !a.y.isEqual(b.y, maxUlps) || !a.z.isEqual(b.z, maxUlps) || !a.w.isEqual(b.w, maxUlps)
fun notEquals(a: Vec4, b: Vec4, maxUlps: Vec4i, res: Vec4bool = Vec4bool()): Vec4bool {
res.x = !a.x.isEqual(b.x, maxUlps.x)
res.y = !a.y.isEqual(b.y, maxUlps.y)
res.z = !a.z.isEqual(b.z, maxUlps.z)
res.w = !a.w.isEqual(b.w, maxUlps.w)
return res
}
}
//fun main() {
// 2.68435456E8f.print()
// 5.36870912E8f.print()
// 1.073741824E9f.print()
// 2.147483648E9f.print()
// 4.294967296E9f.print()
// println('\n')
// 0f.print()
// (-0f).print()
// 1.40129846e-45f.print()
// 1.17549435e-38f.print()
// 0.2f.print()
//
// println(0f == (-0f))
// println(0f.isEqual(-0f, 5))
// println(0.0 == (-0.0))
//}
//
//fun Float.print() = println("i: ${f.asRawIntBits}, exponent: ${f.exponent}, mantissa: ${f.mantissa.asIntBits.asHexString}")