Skip to content

Instantly share code, notes, and snippets.

@scan
Created October 1, 2011 21:23
Show Gist options
  • Save scan/1256675 to your computer and use it in GitHub Desktop.
Save scan/1256675 to your computer and use it in GitHub Desktop.
4x4 matrix
case class Matrix(_1: (Float, Float, Float, Float),
_2: (Float, Float, Float, Float),
_3: (Float, Float, Float, Float),
_4: (Float, Float, Float, Float)) extends Immutable {
lazy val transpose = Matrix(
(_1._1, _2._1, _3._1, _4._1),
(_1._2, _2._2, _3._2, _4._2),
(_1._3, _2._3, _3._3, _4._3),
(_1._4, _2._4, _3._4, _4._4))
def *(f: Float) = Matrix(
(f * _1._1, f * _1._2, f * _1._3, f * _1._4),
(f * _2._1, f * _2._2, f * _2._3, f * _2._4),
(f * _3._1, f * _3._2, f * _3._3, f * _3._4),
(f * _4._1, f * _4._2, f * _4._3, f * _4._4))
def *(v: Vector) = Vector(
v.x * _1._1 + v.y * _2._1 + v.z * _3._1 + _4._1,
v.x * _1._2 + v.y * _2._2 + v.z * _3._2 + _4._2,
v.x * _1._3 + v.y * _2._3 + v.z * _3._3 + _4._3)
// OMG
def *(m: Matrix) = Matrix(
(_1._1 * m._1._1 + _1._2 * m._2._1 + _1._3 * m._3._1 + _1._4 * m._4._1,
_1._1 * m._1._2 + _1._2 * m._2._2 + _1._3 * m._3._2 + _1._4 * m._4._2,
_1._1 * m._1._3 + _1._2 * m._2._3 + _1._3 * m._3._3 + _1._4 * m._4._3,
_1._1 * m._1._4 + _1._2 * m._2._4 + _1._3 * m._3._4 + _1._4 * m._4._4),
(_2._1 * m._1._1 + _2._2 * m._2._1 + _2._3 * m._3._1 + _2._4 * m._4._1,
_2._1 * m._1._2 + _2._2 * m._2._2 + _2._3 * m._3._2 + _2._4 * m._4._2,
_2._1 * m._1._3 + _2._2 * m._2._3 + _2._3 * m._3._3 + _2._4 * m._4._3,
_2._1 * m._1._4 + _2._2 * m._2._4 + _2._3 * m._3._4 + _2._4 * m._4._4),
(_3._1 * m._1._1 + _3._2 * m._2._1 + _3._3 * m._3._1 + _3._4 * m._4._1,
_3._1 * m._1._2 + _3._2 * m._2._2 + _3._3 * m._3._2 + _3._4 * m._4._2,
_3._1 * m._1._3 + _3._2 * m._2._3 + _3._3 * m._3._3 + _3._4 * m._4._3,
_3._1 * m._1._4 + _3._2 * m._2._4 + _3._3 * m._3._4 + _3._4 * m._4._4),
(_4._1 * m._1._1 + _4._2 * m._2._1 + _4._3 * m._3._1 + _4._4 * m._4._1,
_4._1 * m._1._2 + _4._2 * m._2._2 + _4._3 * m._3._2 + _4._4 * m._4._2,
_4._1 * m._1._3 + _4._2 * m._2._3 + _4._3 * m._3._3 + _4._4 * m._4._3,
_4._1 * m._1._4 + _4._2 * m._2._4 + _4._3 * m._3._4 + _4._4 * m._4._4))
}
object Matrix {
val identity = Matrix(
(1, 0, 0, 0),
(0, 1, 0, 0),
(0, 0, 1, 0),
(0, 0, 0, 1))
def translation(v: Vector) = Matrix(
(1, 0, 0, 0),
(0, 1, 0, 0),
(0, 0, 1, 0),
(v.x, v.y, v.z, 1))
def scaling(v: Vector) = Matrix(
(v.x, 0, 0, 0),
(0, v.y, 0, 0),
(0, 0, v.z, 0),
(0, 0, 0, 1))
def scaling(f: Float) = Matrix(
(f, 0, 0, 0),
(0, f, 0, 0),
(0, 0, f, 0),
(0, 0, 0, 1))
import scala.math.{ sin, cos }
def rotaX(a: Float) = {
val s = sin(a.toDouble).toFloat
val c = cos(a.toDouble).toFloat
Matrix(
(1, 0, 0, 0),
(0, c, s, 0),
(0, -s, c, 0),
(0, 0, 0, 1))
}
def rotaY(a: Float) = {
val s = sin(a.toDouble).toFloat
val c = cos(a.toDouble).toFloat
Matrix(
(c, 0, -s, 0),
(0, 1, 0, 0),
(s, 0, c, 0),
(0, 0, 0, 1))
}
def rotaZ(a: Float) = {
val s = sin(a.toDouble).toFloat
val c = cos(a.toDouble).toFloat
Matrix(
(c, s, 0, 0),
(-s, c, 0, 0),
(0, 0, 1, 0),
(0, 0, 0, 1))
}
implicit def asArray(m: Matrix) = Array(
m._1._1, m._1._2, m._1._3, m._1._4,
m._2._1, m._2._2, m._2._3, m._2._4,
m._3._1, m._3._2, m._3._3, m._3._4,
m._4._1, m._4._2, m._4._3, m._4._4)
implicit def asFloatBuffer(m: Matrix) = {
import java.nio.FloatBuffer
val buf = FloatBuffer.allocate(16)
buf.put(m)
buf
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment