Skip to content

Commit 36e907c

Browse files
Add Vector and Matrix compare, equal and equals with epsilon parameter (#48)
* Add Vector and Matrix compare, equal and equals with epsilon parameter * Add Quaternion compare, equal and equals with epsilon parameter * Use normalized Quaternion when comparing them * Cleanup + Change to compareTo + Remove normalizing + Fixes
1 parent 5d61c07 commit 36e907c

File tree

4 files changed

+277
-18
lines changed

4 files changed

+277
-18
lines changed

src/commonMain/kotlin/dev/romainguy/kotlin/math/Matrix.kt

Lines changed: 121 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,12 @@ data class Mat2(
8585
operator fun minus(v: Float) = Mat2(x - v, y - v)
8686
operator fun times(v: Float) = Mat2(x * v, y * v)
8787
operator fun div(v: Float) = Mat2(x / v, y / v)
88+
inline fun compareTo(v: Float, delta: Float = 0.0f) = Mat2(
89+
x.compareTo(v, delta),
90+
y.compareTo(v, delta)
91+
)
92+
93+
inline fun equals(v: Float, delta: Float = 0.0f) = x.equals(v, delta) && y.equals(v, delta)
8894

8995
operator fun times(m: Mat2) = Mat2(
9096
Float2(
@@ -97,12 +103,18 @@ data class Mat2(
97103
)
98104
)
99105

106+
inline fun compareTo(m: Mat2, delta: Float = 0.0f) = Mat2(
107+
x.compareTo(m.x, delta),
108+
y.compareTo(m.y, delta)
109+
)
110+
111+
inline fun equals(m: Mat2, delta: Float = 0.0f) = x.equals(m.x, delta) && y.equals(m.y, delta)
112+
100113
operator fun times(v: Float2) = Float2(
101114
x.x * v.x + y.x * v.y,
102115
x.y * v.x + y.y * v.y,
103116
)
104117

105-
106118
fun toFloatArray() = floatArrayOf(
107119
x.x, y.x,
108120
x.y, y.y
@@ -114,7 +126,6 @@ data class Mat2(
114126
|${x.y} ${y.y}|
115127
""".trimIndent()
116128
}
117-
118129
}
119130

120131
data class Mat3(
@@ -170,6 +181,14 @@ data class Mat3(
170181
operator fun minus(v: Float) = Mat3(x - v, y - v, z - v)
171182
operator fun times(v: Float) = Mat3(x * v, y * v, z * v)
172183
operator fun div(v: Float) = Mat3(x / v, y / v, z / v)
184+
inline fun compareTo(v: Float, delta: Float = 0.0f) = Mat3(
185+
x.compareTo(v, delta),
186+
y.compareTo(v, delta),
187+
z.compareTo(v, delta)
188+
)
189+
190+
inline fun equals(v: Float, delta: Float = 0.0f) =
191+
x.equals(v, delta) && y.equals(v, delta) && z.equals(v, delta)
173192

174193
operator fun times(m: Mat3) = Mat3(
175194
Float3(
@@ -189,6 +208,15 @@ data class Mat3(
189208
)
190209
)
191210

211+
inline fun compareTo(m: Mat3, delta: Float = 0.0f) = Mat3(
212+
x.compareTo(m.x, delta),
213+
y.compareTo(m.y, delta),
214+
z.compareTo(m.z, delta)
215+
)
216+
217+
inline fun equals(m: Mat3, delta: Float = 0.0f) =
218+
x.equals(m.x, delta) && y.equals(m.y, delta) && z.equals(m.z, delta)
219+
192220
operator fun times(v: Float3) = Float3(
193221
x.x * v.x + y.x * v.y + z.x * v.z,
194222
x.y * v.x + y.y * v.y + z.y * v.z,
@@ -311,6 +339,15 @@ data class Mat4(
311339
operator fun minus(v: Float) = Mat4(x - v, y - v, z - v, w - v)
312340
operator fun times(v: Float) = Mat4(x * v, y * v, z * v, w * v)
313341
operator fun div(v: Float) = Mat4(x / v, y / v, z / v, w / v)
342+
inline fun compareTo(v: Float, delta: Float = 0.0f) = Mat4(
343+
x.compareTo(v, delta),
344+
y.compareTo(v, delta),
345+
z.compareTo(v, delta),
346+
w.compareTo(v, delta)
347+
)
348+
349+
inline fun equals(v: Float, delta: Float = 0.0f) =
350+
x.equals(v, delta) && y.equals(v, delta) && z.equals(v, delta) && w.equals(v, delta)
314351

315352
operator fun times(m: Mat4) = Mat4(
316353
Float4(
@@ -339,6 +376,16 @@ data class Mat4(
339376
)
340377
)
341378

379+
inline fun compareTo(m: Mat4, delta: Float = 0.0f) = Mat4(
380+
x.compareTo(m.x, delta),
381+
y.compareTo(m.y, delta),
382+
z.compareTo(m.z, delta),
383+
w.compareTo(m.w, delta)
384+
)
385+
386+
inline fun equals(m: Mat4, delta: Float = 0.0f) =
387+
x.equals(m.x, delta) && y.equals(m.y, delta) && z.equals(m.z, delta) && w.equals(m.w, delta)
388+
342389
operator fun times(v: Float4) = Float4(
343390
x.x * v.x + y.x * v.y + z.x * v.z+ w.x * v.w,
344391
x.y * v.x + y.y * v.y + z.y * v.z+ w.y * v.w,
@@ -385,6 +432,78 @@ data class Mat4(
385432
}
386433
}
387434

435+
inline fun equal(a: Mat2, b: Float, delta: Float = 0.0f) = Bool2(
436+
a.x.equals(b, delta),
437+
a.y.equals(b, delta)
438+
)
439+
440+
inline fun equal(a: Mat2, b: Mat2, delta: Float = 0.0f) = Bool2(
441+
a.x.equals(b.x, delta),
442+
a.y.equals(b.y, delta)
443+
)
444+
445+
inline fun notEqual(a: Mat2, b: Float, delta: Float = 0.0f) = Bool2(
446+
!a.x.equals(b, delta),
447+
!a.y.equals(b, delta)
448+
)
449+
450+
inline fun notEqual(a: Mat2, b: Mat2, delta: Float = 0.0f) = Bool2(
451+
!a.x.equals(b.x, delta),
452+
!a.y.equals(b.y, delta)
453+
)
454+
455+
inline fun equal(a: Mat3, b: Float, delta: Float = 0.0f) = Bool3(
456+
a.x.equals(b, delta),
457+
a.y.equals(b, delta),
458+
a.z.equals(b, delta)
459+
)
460+
461+
inline fun equal(a: Mat3, b: Mat3, delta: Float = 0.0f) = Bool3(
462+
a.x.equals(b.x, delta),
463+
a.y.equals(b.y, delta),
464+
a.z.equals(b.z, delta)
465+
)
466+
467+
inline fun notEqual(a: Mat3, b: Float, delta: Float = 0.0f) = Bool3(
468+
!a.x.equals(b, delta),
469+
!a.y.equals(b, delta),
470+
!a.z.equals(b, delta)
471+
)
472+
473+
inline fun notEqual(a: Mat3, b: Mat3, delta: Float = 0.0f) = Bool3(
474+
!a.x.equals(b.x, delta),
475+
!a.y.equals(b.y, delta),
476+
!a.z.equals(b.z, delta)
477+
)
478+
479+
inline fun equal(a: Mat4, b: Float, delta: Float = 0.0f) = Bool4(
480+
a.x.equals(b, delta),
481+
a.y.equals(b, delta),
482+
a.z.equals(b, delta),
483+
a.w.equals(b, delta)
484+
)
485+
486+
inline fun equal(a: Mat4, b: Mat4, delta: Float = 0.0f) = Bool4(
487+
a.x.equals(b.x, delta),
488+
a.y.equals(b.y, delta),
489+
a.z.equals(b.z, delta),
490+
a.w.equals(b.w, delta)
491+
)
492+
493+
inline fun notEqual(a: Mat4, b: Float, delta: Float = 0.0f) = Bool4(
494+
!a.x.equals(b, delta),
495+
!a.y.equals(b, delta),
496+
!a.z.equals(b, delta),
497+
!a.w.equals(b, delta)
498+
)
499+
500+
inline fun notEqual(a: Mat4, b: Mat4, delta: Float = 0.0f) = Bool4(
501+
!a.x.equals(b.x, delta),
502+
!a.y.equals(b.y, delta),
503+
!a.z.equals(b.z, delta),
504+
!a.w.equals(b.w, delta)
505+
)
506+
388507
fun transpose(m: Mat2) = Mat2(
389508
Float2(m.x.x, m.y.x),
390509
Float2(m.x.y, m.y.y)

src/commonMain/kotlin/dev/romainguy/kotlin/math/Quaternion.kt

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,8 @@ data class Quaternion(
263263
inline operator fun minus(v: Float) = Quaternion(x - v, y - v, z - v, w - v)
264264
inline operator fun times(v: Float) = Quaternion(x * v, y * v, z * v, w * v)
265265
inline operator fun div(v: Float) = Quaternion(x / v, y / v, z / v, w / v)
266+
inline fun compareTo(v: Float, delta: Float = 0.0f) = xyzw.compareTo(v, delta)
267+
inline fun equals(v: Float, delta: Float = 0.0f) = xyzw.equals(v, delta)
266268

267269
inline operator fun times(v: Float3) = (this * Quaternion(v, 0.0f) * inverse(this)).xyz
268270

@@ -274,6 +276,9 @@ data class Quaternion(
274276
w * q.z + x * q.y - y * q.x + z * q.w,
275277
w * q.w - x * q.x - y * q.y - z * q.z)
276278

279+
inline fun compareTo(v: Float4, delta: Float = 0.0f) = xyzw.compareTo(v.xyzw, delta)
280+
inline fun equals(v: Float4, delta: Float = 0.0f) = xyzw.equals(v.xyzw, delta)
281+
277282
inline fun transform(block: (Float) -> Float): Quaternion {
278283
x = block(x)
279284
y = block(y)
@@ -294,6 +299,32 @@ inline operator fun Float.minus(q: Quaternion) = Quaternion(this - q.x, this - q
294299
inline operator fun Float.times(q: Quaternion) = Quaternion(this * q.x, this * q.y, this * q.z, this * q.w)
295300
inline operator fun Float.div(q: Quaternion) = Quaternion(this / q.x, this / q.y, this / q.z, this / q.w)
296301

302+
inline fun lessThan(a: Quaternion, b: Float) = lessThan(a.xyzw, b)
303+
inline fun lessThan(a: Quaternion, b: Quaternion) = lessThan(a.xyzw, b.xyzw)
304+
inline fun lessThanEqual(a: Quaternion, b: Float) = lessThanEqual(a.xyzw, b)
305+
inline fun lessThanEqual(a: Quaternion, b: Quaternion) = lessThanEqual(a.xyzw, b.xyzw)
306+
inline fun greaterThan(a: Quaternion, b: Float) = greaterThan(a.xyzw, b)
307+
inline fun greaterThan(a: Quaternion, b: Quaternion) = greaterThan(a.xyzw, b.xyzw)
308+
inline fun greaterThanEqual(a: Quaternion, b: Float) = greaterThanEqual(a.xyzw, b)
309+
inline fun greaterThanEqual(a: Quaternion, b: Quaternion) = greaterThanEqual(a.xyzw, b.xyzw)
310+
inline fun equal(a: Quaternion, b: Float) = equal(a.xyzw, b)
311+
inline fun equal(a: Quaternion, b: Quaternion) = equal(a.xyzw, b.xyzw)
312+
inline fun notEqual(a: Quaternion, b: Float) = notEqual(a.xyzw, b)
313+
inline fun notEqual(a: Quaternion, b: Quaternion) = notEqual(a.xyzw, b.xyzw)
314+
315+
inline infix fun Quaternion.lt(b: Float) = xyzw.lt(b)
316+
inline infix fun Quaternion.lt(b: Float4) = xyzw.lt(b.xyzw)
317+
inline infix fun Quaternion.lte(b: Float) = xyzw.lte(b)
318+
inline infix fun Quaternion.lte(b: Float4) = xyzw.lte(b.xyzw)
319+
inline infix fun Quaternion.gt(b: Float) = xyzw.gt(b)
320+
inline infix fun Quaternion.gt(b: Float4) = xyzw.gt(b.xyzw)
321+
inline infix fun Quaternion.gte(b: Float) = xyzw.gte(b)
322+
inline infix fun Quaternion.gte(b: Float4) = xyzw.gte(b.xyzw)
323+
inline infix fun Quaternion.eq(b: Float) = xyzw.eq(b)
324+
inline infix fun Quaternion.eq(b: Float4) = xyzw.eq(b.xyzw)
325+
inline infix fun Quaternion.neq(b: Float) = xyzw.neq(b)
326+
inline infix fun Quaternion.neq(b: Float4) = xyzw.neq(b.xyzw)
327+
297328
inline fun abs(q: Quaternion) = Quaternion(abs(q.x), abs(q.y), abs(q.z), abs(q.w))
298329
inline fun length(q: Quaternion) = sqrt(q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w)
299330
inline fun length2(q: Quaternion) = q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w

0 commit comments

Comments
 (0)