 9 people like it.

XNA's Vector3 with units of measure

A vector type with units of measure built on top of XNA's Vector3. Not complete, the point is mainly to show how to use generic units of measure to adapt an existing type.

 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: Fake definition of Vector3 /// A three-dimensional vector with a unit of measure. Built on top of Xna's Vector3. type TypedVector3<[] 'M> = struct val v : Vector3 new(x : float32<'M>, y : float32<'M>, z : float32<'M>) = { v = Vector3(float32 x, float32 y, float32 z) } new(V) = { v = V } end [] module TypedVector = let add3 (U : TypedVector3<'M>, V : TypedVector3<'M>) = new TypedVector3<'M>(U.v + V.v) let sub3 (U : TypedVector3<'M>, V : TypedVector3<'M>) = new TypedVector3<'M>(U.v - V.v) let dot3 (U : TypedVector3<'M>, V : TypedVector3<'N>) = Vector3.Dot(U.v, V.v) |> LanguagePrimitives.Float32WithMeasure<'M 'N> let len3 (U : TypedVector3<'M>) = LanguagePrimitives.Float32WithMeasure<'M> (U.v.Length()) let scale3 (k : float32<'K>, U : TypedVector3<'M>) : TypedVector3<'K 'M> = let conv = LanguagePrimitives.Float32WithMeasure<'K 'M> let v = Vector3.Multiply(U.v, float32 k) new TypedVector3<_>(conv v.X, conv v.Y, conv v.Z) let normalize3 (U : TypedVector3<'M>) = let len = len3 U scale3 ((1.0f / len), U) type TypedVector3<[] 'M> with static member public (*) (k, U) = TypedVector.scale3 (k, U) static member public (+) (U, V) = TypedVector.add3 (U, V) static member public (-) (U, V) = TypedVector.sub3 (U, V) member public this.Length = this |> TypedVector.len3 // Example [] type m [] type s let speed = new TypedVector3(1.0f<_>, 0.0f<_>, 0.0f<_>) let time = 10.0f let movement = time * speed
type Vector3 =
struct
val X : float32
val Y : float32
val Z : float32

new(x, y, z) = { X = x; Y = y; Z = z }

static member public (+) (U : Vector3, V : Vector3) : Vector3 = failwith ""
static member public (-) (U : Vector3, V : Vector3) : Vector3 = failwith ""
static member public Dot (U : Vector3, V : Vector3) : float32 = failwith ""
static member public (*) (k : float32, V : Vector3) : Vector3 = failwith ""
static member public Multiply (V : Vector3, k : float32) : Vector3 = failwith ""
member public this.Length() : float32 = failwith ""
end
Multiple items
type TypedVector3<'M> =
struct
new : V:Vector3 -> TypedVector3<'M>
new : x:float32<'M> * y:float32<'M> * z:float32<'M> -> TypedVector3<'M>
val v: Vector3
member Length : float32<'M>
static member ( + ) : U:TypedVector3<'u> * V:TypedVector3<'u> -> TypedVector3<'u>
static member ( * ) : k:float32<'u> * U:TypedVector3<'v> -> TypedVector3<'u 'v>
static member ( - ) : U:TypedVector3<'u> * V:TypedVector3<'u> -> TypedVector3<'u>
end

Full name: Script.TypedVector3<_>

A three-dimensional vector with a unit of measure. Built on top of Xna's Vector3.

--------------------
TypedVector3()
new : V:Vector3 -> TypedVector3<'M>
new : x:float32<'M> * y:float32<'M> * z:float32<'M> -> TypedVector3<'M>
Multiple items
type MeasureAttribute =
inherit Attribute
new : unit -> MeasureAttribute

Full name: Microsoft.FSharp.Core.MeasureAttribute

--------------------
new : unit -> MeasureAttribute
TypedVector3.v: Vector3
Multiple items
type Vector3 =
struct
new : x:float32 * y:float32 * z:float32 -> Vector3
val X: float32
val Y: float32
val Z: float32
member Length : unit -> float32
static member Dot : U:Vector3 * V:Vector3 -> float32
static member Multiply : V:Vector3 * k:float32 -> Vector3
static member ( + ) : U:Vector3 * V:Vector3 -> Vector3
static member ( * ) : k:float32 * V:Vector3 -> Vector3
static member ( - ) : U:Vector3 * V:Vector3 -> Vector3
end

Full name: Script.Vector3

--------------------
Vector3()
new : x:float32 * y:float32 * z:float32 -> Vector3
val x : float32<'M>
Multiple items
val float32 : value:'T -> float32 (requires member op_Explicit)

Full name: Microsoft.FSharp.Core.Operators.float32

--------------------
type float32 = System.Single

Full name: Microsoft.FSharp.Core.float32

--------------------
type float32<'Measure> = float32

Full name: Microsoft.FSharp.Core.float32<_>
val y : float32<'M>
val z : float32<'M>
val V : Vector3
Multiple items
type RequireQualifiedAccessAttribute =
inherit Attribute
new : unit -> RequireQualifiedAccessAttribute

Full name: Microsoft.FSharp.Core.RequireQualifiedAccessAttribute

--------------------
new : unit -> RequireQualifiedAccessAttribute
val add3 : U:TypedVector3<'M> * V:TypedVector3<'M> -> TypedVector3<'M>

val U : TypedVector3<'M>
val V : TypedVector3<'M>
val sub3 : U:TypedVector3<'M> * V:TypedVector3<'M> -> TypedVector3<'M>

Full name: Script.TypedVector.sub3
val dot3 : U:TypedVector3<'M> * V:TypedVector3<'N> -> float32<'M 'N>

Full name: Script.TypedVector.dot3
val V : TypedVector3<'N>
static member Vector3.Dot : U:Vector3 * V:Vector3 -> float32
module LanguagePrimitives

from Microsoft.FSharp.Core
val Float32WithMeasure : float32 -> float32<'Measure>

Full name: Microsoft.FSharp.Core.LanguagePrimitives.Float32WithMeasure
val len3 : U:TypedVector3<'M> -> float32<'M>

Full name: Script.TypedVector.len3
member Vector3.Length : unit -> float32
val scale3 : k:float32<'K> * U:TypedVector3<'M> -> TypedVector3<'K 'M>

Full name: Script.TypedVector.scale3
val k : float32<'K>
val conv : (float32 -> float32<'K 'M>)
val v : Vector3
static member Vector3.Multiply : V:Vector3 * k:float32 -> Vector3
Vector3.X: float32
Vector3.Y: float32
Vector3.Z: float32
val normalize3 : U:TypedVector3<'M> -> TypedVector3<1>

Full name: Script.TypedVector.normalize3
val len : float32<'M>
val k : float32<'u>
val U : TypedVector3<'v>
module TypedVector

from Script
val U : TypedVector3<'u>
val V : TypedVector3<'u>
val this : byref<TypedVector3<'M>>
member TypedVector3.Length : float32<'M>

Full name: Script.TypedVector3.Length
[<Measure>]
type m

Full name: Script.m
[<Measure>]
type s

Full name: Script.s
val speed : TypedVector3<m/s>

Full name: Script.speed
val time : float32<s>

Full name: Script.time
val movement : TypedVector3<m>

Full name: Script.movement