Add Vector2 math functions
This commit is contained in:
parent
8f1ad11c49
commit
e26bb6378f
1 changed files with 140 additions and 44 deletions
|
@ -1,4 +1,4 @@
|
|||
// Package raymath - Some useful functions to work with Vector3, Matrix and Quaternions
|
||||
// Package raymath - Some useful functions to work with Vector2, Vector3, Matrix and Quaternions
|
||||
package raymath
|
||||
|
||||
import (
|
||||
|
@ -7,26 +7,109 @@ import (
|
|||
"github.com/gen2brain/raylib-go/raylib"
|
||||
)
|
||||
|
||||
// Clamp - Clamp float value
|
||||
func Clamp(value, min, max float32) float32 {
|
||||
var res float32
|
||||
if value < min {
|
||||
res = min
|
||||
} else {
|
||||
res = value
|
||||
}
|
||||
|
||||
if res > max {
|
||||
return max
|
||||
}
|
||||
|
||||
return res
|
||||
}
|
||||
|
||||
// Vector2Zero - Vector with components value 0.0
|
||||
func Vector2Zero() raylib.Vector2 {
|
||||
return raylib.NewVector2(0.0, 0.0)
|
||||
}
|
||||
|
||||
// Vector2One - Vector with components value 1.0
|
||||
func Vector2One() raylib.Vector2 {
|
||||
return raylib.NewVector2(1.0, 1.0)
|
||||
}
|
||||
|
||||
// Vector2Add - Add two vectors (v1 + v2)
|
||||
func Vector2Add(v1, v2 raylib.Vector2) raylib.Vector2 {
|
||||
return raylib.NewVector2(v1.X+v2.X, v1.Y+v2.Y)
|
||||
}
|
||||
|
||||
// Vector2Subtract - Subtract two vectors (v1 - v2)
|
||||
func Vector2Subtract(v1, v2 raylib.Vector2) raylib.Vector2 {
|
||||
return raylib.NewVector2(v1.X-v2.X, v1.Y-v2.Y)
|
||||
}
|
||||
|
||||
// Vector2Lenght - Calculate vector lenght
|
||||
func Vector2Lenght(v raylib.Vector2) float32 {
|
||||
return float32(math.Sqrt(float64((v.X * v.X) + (v.Y * v.Y))))
|
||||
}
|
||||
|
||||
// Vector2DotProduct - Calculate two vectors dot product
|
||||
func Vector2DotProduct(v1, v2 raylib.Vector2) float32 {
|
||||
return (v1.X*v2.X + v1.Y*v2.Y)
|
||||
}
|
||||
|
||||
// Vector2Distance - Calculate distance between two vectors
|
||||
func Vector2Distance(v1, v2 raylib.Vector2) float32 {
|
||||
return float32(math.Sqrt(float64((v1.X-v2.X)*(v1.X-v2.X) + (v1.Y-v2.Y)*(v1.Y-v2.Y))))
|
||||
}
|
||||
|
||||
// Vector2Angle - Calculate angle from two vectors in X-axis
|
||||
func Vector2Angle(v1, v2 raylib.Vector2) float32 {
|
||||
angle := float32(math.Atan2(float64(v2.Y-v1.Y), float64(v2.X-v1.X)) * (180.0 / float64(raylib.Pi)))
|
||||
|
||||
if angle < 0 {
|
||||
angle += 360.0
|
||||
}
|
||||
|
||||
return angle
|
||||
}
|
||||
|
||||
// Vector2Scale - Scale vector (multiply by value)
|
||||
func Vector2Scale(v *raylib.Vector2, scale float32) {
|
||||
v.X *= scale
|
||||
v.Y *= scale
|
||||
}
|
||||
|
||||
// Vector2Negate - Negate vector
|
||||
func Vector2Negate(v *raylib.Vector2) {
|
||||
v.X = -v.X
|
||||
v.Y = -v.Y
|
||||
}
|
||||
|
||||
// Vector2Divide - Divide vector by a float value
|
||||
func Vector2Divide(v *raylib.Vector2, div float32) {
|
||||
v.X = v.X / div
|
||||
v.Y = v.Y / div
|
||||
}
|
||||
|
||||
// Vector2Normalize - Normalize provided vector
|
||||
func Vector2Normalize(v *raylib.Vector2) {
|
||||
Vector2Divide(v, Vector2Lenght(*v))
|
||||
}
|
||||
|
||||
// VectorZero - Vector with components value 0.0
|
||||
func VectorZero() raylib.Vector3 {
|
||||
return raylib.NewVector3(0.0, 0.0, 0.0)
|
||||
}
|
||||
|
||||
// VectorOne - Vector with components value 1.0
|
||||
func VectorOne() raylib.Vector3 {
|
||||
return raylib.NewVector3(1.0, 1.0, 1.0)
|
||||
}
|
||||
|
||||
// VectorAdd - Add two vectors
|
||||
func VectorAdd(v1, v2 raylib.Vector3) raylib.Vector3 {
|
||||
result := raylib.Vector3{}
|
||||
|
||||
result.X = v1.X + v2.X
|
||||
result.Y = v1.Y + v2.Y
|
||||
result.Z = v1.Z + v2.Z
|
||||
|
||||
return result
|
||||
return raylib.NewVector3(v1.X+v2.X, v1.Y+v2.Y, v1.Z+v2.Z)
|
||||
}
|
||||
|
||||
// VectorSubtract - Subtract two vectors
|
||||
func VectorSubtract(v1, v2 raylib.Vector3) raylib.Vector3 {
|
||||
result := raylib.Vector3{}
|
||||
|
||||
result.X = v1.X - v2.X
|
||||
result.Y = v1.Y - v2.Y
|
||||
result.Z = v1.Z - v2.Z
|
||||
|
||||
return result
|
||||
return raylib.NewVector3(v1.X-v2.X, v1.Y-v2.Y, v1.Z-v2.Z)
|
||||
}
|
||||
|
||||
// VectorCrossProduct - Calculate two vectors cross product
|
||||
|
@ -61,14 +144,23 @@ func VectorPerpendicular(v raylib.Vector3) raylib.Vector3 {
|
|||
return result
|
||||
}
|
||||
|
||||
// VectorLength - Calculate vector length
|
||||
func VectorLength(v raylib.Vector3) float32 {
|
||||
return float32(math.Sqrt(float64(v.X*v.X + v.Y*v.Y + v.Z*v.Z)))
|
||||
}
|
||||
|
||||
// VectorDotProduct - Calculate two vectors dot product
|
||||
func VectorDotProduct(v1, v2 raylib.Vector3) float32 {
|
||||
return v1.X*v2.X + v1.Y*v2.Y + v1.Z*v2.Z
|
||||
}
|
||||
|
||||
// VectorLength - Calculate vector length
|
||||
func VectorLength(v raylib.Vector3) float32 {
|
||||
return float32(math.Sqrt(float64(v.X*v.X + v.Y*v.Y + v.Z*v.Z)))
|
||||
// VectorDistance - Calculate distance between two vectors
|
||||
func VectorDistance(v1, v2 raylib.Vector3) float32 {
|
||||
dx := v2.X - v1.X
|
||||
dy := v2.Y - v1.Y
|
||||
dz := v2.Z - v1.Z
|
||||
|
||||
return float32(math.Sqrt(float64(dx*dx + dy*dy + dz*dz)))
|
||||
}
|
||||
|
||||
// VectorScale - Scale provided vector
|
||||
|
@ -102,17 +194,15 @@ func VectorNormalize(v *raylib.Vector3) {
|
|||
v.Z *= ilength
|
||||
}
|
||||
|
||||
// VectorDistance - Calculate distance between two points
|
||||
func VectorDistance(v1, v2 raylib.Vector3) float32 {
|
||||
var result float32
|
||||
// VectorTransform - Transforms a Vector3 by a given Matrix
|
||||
func VectorTransform(v *raylib.Vector3, mat raylib.Matrix) {
|
||||
x := v.X
|
||||
y := v.Y
|
||||
z := v.Z
|
||||
|
||||
dx := v2.X - v1.X
|
||||
dy := v2.Y - v1.Y
|
||||
dz := v2.Z - v1.Z
|
||||
|
||||
result = float32(math.Sqrt(float64(dx*dx + dy*dy + dz*dz)))
|
||||
|
||||
return result
|
||||
v.X = mat.M0*x + mat.M4*y + mat.M8*z + mat.M12
|
||||
v.Y = mat.M1*x + mat.M5*y + mat.M9*z + mat.M13
|
||||
v.Z = mat.M2*x + mat.M6*y + mat.M10*z + mat.M14
|
||||
}
|
||||
|
||||
// VectorLerp - Calculate linear interpolation between two vectors
|
||||
|
@ -143,22 +233,6 @@ func VectorReflect(vector, normal raylib.Vector3) raylib.Vector3 {
|
|||
return result
|
||||
}
|
||||
|
||||
// VectorTransform - Transforms a Vector3 by a given Matrix
|
||||
func VectorTransform(v *raylib.Vector3, mat raylib.Matrix) {
|
||||
x := v.X
|
||||
y := v.Y
|
||||
z := v.Z
|
||||
|
||||
v.X = mat.M0*x + mat.M4*y + mat.M8*z + mat.M12
|
||||
v.Y = mat.M1*x + mat.M5*y + mat.M9*z + mat.M13
|
||||
v.Z = mat.M2*x + mat.M6*y + mat.M10*z + mat.M14
|
||||
}
|
||||
|
||||
// VectorZero - Return a Vector3 init to zero
|
||||
func VectorZero() raylib.Vector3 {
|
||||
return raylib.NewVector3(0.0, 0.0, 0.0)
|
||||
}
|
||||
|
||||
// VectorMin - Return min value for each pair of components
|
||||
func VectorMin(vec1, vec2 raylib.Vector3) raylib.Vector3 {
|
||||
result := raylib.Vector3{}
|
||||
|
@ -181,6 +255,28 @@ func VectorMax(vec1, vec2 raylib.Vector3) raylib.Vector3 {
|
|||
return result
|
||||
}
|
||||
|
||||
// VectorBarycenter - Barycenter coords for p in triangle abc
|
||||
func VectorBarycenter(p, a, b, c raylib.Vector3) raylib.Vector3 {
|
||||
v0 := VectorSubtract(b, a)
|
||||
v1 := VectorSubtract(c, a)
|
||||
v2 := VectorSubtract(p, a)
|
||||
d00 := VectorDotProduct(v0, v0)
|
||||
d01 := VectorDotProduct(v0, v1)
|
||||
d11 := VectorDotProduct(v1, v1)
|
||||
d20 := VectorDotProduct(v2, v0)
|
||||
d21 := VectorDotProduct(v2, v1)
|
||||
|
||||
denom := d00*d11 - d01*d01
|
||||
|
||||
result := raylib.Vector3{}
|
||||
|
||||
result.Y = (d11*d20 - d01*d21) / denom
|
||||
result.Z = (d00*d21 - d01*d20) / denom
|
||||
result.X = 1.0 - (result.Z + result.Y)
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
// MatrixDeterminant - Compute matrix determinant
|
||||
func MatrixDeterminant(mat raylib.Matrix) float32 {
|
||||
var result float32
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue