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
|
package raymath
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@ -7,26 +7,109 @@ import (
|
||||||
"github.com/gen2brain/raylib-go/raylib"
|
"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
|
// VectorAdd - Add two vectors
|
||||||
func VectorAdd(v1, v2 raylib.Vector3) raylib.Vector3 {
|
func VectorAdd(v1, v2 raylib.Vector3) raylib.Vector3 {
|
||||||
result := raylib.Vector3{}
|
return raylib.NewVector3(v1.X+v2.X, v1.Y+v2.Y, v1.Z+v2.Z)
|
||||||
|
|
||||||
result.X = v1.X + v2.X
|
|
||||||
result.Y = v1.Y + v2.Y
|
|
||||||
result.Z = v1.Z + v2.Z
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// VectorSubtract - Subtract two vectors
|
// VectorSubtract - Subtract two vectors
|
||||||
func VectorSubtract(v1, v2 raylib.Vector3) raylib.Vector3 {
|
func VectorSubtract(v1, v2 raylib.Vector3) raylib.Vector3 {
|
||||||
result := raylib.Vector3{}
|
return raylib.NewVector3(v1.X-v2.X, v1.Y-v2.Y, v1.Z-v2.Z)
|
||||||
|
|
||||||
result.X = v1.X - v2.X
|
|
||||||
result.Y = v1.Y - v2.Y
|
|
||||||
result.Z = v1.Z - v2.Z
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// VectorCrossProduct - Calculate two vectors cross product
|
// VectorCrossProduct - Calculate two vectors cross product
|
||||||
|
@ -61,14 +144,23 @@ func VectorPerpendicular(v raylib.Vector3) raylib.Vector3 {
|
||||||
return result
|
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
|
// VectorDotProduct - Calculate two vectors dot product
|
||||||
func VectorDotProduct(v1, v2 raylib.Vector3) float32 {
|
func VectorDotProduct(v1, v2 raylib.Vector3) float32 {
|
||||||
return v1.X*v2.X + v1.Y*v2.Y + v1.Z*v2.Z
|
return v1.X*v2.X + v1.Y*v2.Y + v1.Z*v2.Z
|
||||||
}
|
}
|
||||||
|
|
||||||
// VectorLength - Calculate vector length
|
// VectorDistance - Calculate distance between two vectors
|
||||||
func VectorLength(v raylib.Vector3) float32 {
|
func VectorDistance(v1, v2 raylib.Vector3) float32 {
|
||||||
return float32(math.Sqrt(float64(v.X*v.X + v.Y*v.Y + v.Z*v.Z)))
|
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
|
// VectorScale - Scale provided vector
|
||||||
|
@ -102,17 +194,15 @@ func VectorNormalize(v *raylib.Vector3) {
|
||||||
v.Z *= ilength
|
v.Z *= ilength
|
||||||
}
|
}
|
||||||
|
|
||||||
// VectorDistance - Calculate distance between two points
|
// VectorTransform - Transforms a Vector3 by a given Matrix
|
||||||
func VectorDistance(v1, v2 raylib.Vector3) float32 {
|
func VectorTransform(v *raylib.Vector3, mat raylib.Matrix) {
|
||||||
var result float32
|
x := v.X
|
||||||
|
y := v.Y
|
||||||
|
z := v.Z
|
||||||
|
|
||||||
dx := v2.X - v1.X
|
v.X = mat.M0*x + mat.M4*y + mat.M8*z + mat.M12
|
||||||
dy := v2.Y - v1.Y
|
v.Y = mat.M1*x + mat.M5*y + mat.M9*z + mat.M13
|
||||||
dz := v2.Z - v1.Z
|
v.Z = mat.M2*x + mat.M6*y + mat.M10*z + mat.M14
|
||||||
|
|
||||||
result = float32(math.Sqrt(float64(dx*dx + dy*dy + dz*dz)))
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// VectorLerp - Calculate linear interpolation between two vectors
|
// VectorLerp - Calculate linear interpolation between two vectors
|
||||||
|
@ -143,22 +233,6 @@ func VectorReflect(vector, normal raylib.Vector3) raylib.Vector3 {
|
||||||
return result
|
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
|
// VectorMin - Return min value for each pair of components
|
||||||
func VectorMin(vec1, vec2 raylib.Vector3) raylib.Vector3 {
|
func VectorMin(vec1, vec2 raylib.Vector3) raylib.Vector3 {
|
||||||
result := raylib.Vector3{}
|
result := raylib.Vector3{}
|
||||||
|
@ -181,6 +255,28 @@ func VectorMax(vec1, vec2 raylib.Vector3) raylib.Vector3 {
|
||||||
return result
|
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
|
// MatrixDeterminant - Compute matrix determinant
|
||||||
func MatrixDeterminant(mat raylib.Matrix) float32 {
|
func MatrixDeterminant(mat raylib.Matrix) float32 {
|
||||||
var result float32
|
var result float32
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue