Init, test raylib & math things
This commit is contained in:
commit
d2f0abff6a
5 changed files with 200 additions and 0 deletions
71
vec3.go
Normal file
71
vec3.go
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"math"
|
||||
)
|
||||
|
||||
type Vector3 struct {
|
||||
X, Y, Z float64
|
||||
}
|
||||
|
||||
func (u Vector3) Add(v Vector3) Vector3 {
|
||||
return Vector3{u.X + v.X, u.Y + v.Y, u.Z + v.Z}
|
||||
}
|
||||
|
||||
func (u Vector3) Neg() Vector3 {
|
||||
return Vector3{-u.X, -u.Y, -u.Z}
|
||||
}
|
||||
|
||||
func (u Vector3) Sub(v Vector3) Vector3 {
|
||||
return u.Add(v.Neg())
|
||||
}
|
||||
|
||||
func (u Vector3) Scale(a float64) Vector3 {
|
||||
return Vector3{a * u.X, a * u.Y, a * u.Z}
|
||||
}
|
||||
|
||||
func (u Vector3) Dot(v Vector3) float64 {
|
||||
return u.X*v.X + u.Y*v.Y + u.Z*v.Z
|
||||
}
|
||||
|
||||
func (u Vector3) Cross(v Vector3) Vector3 {
|
||||
return Vector3{u.Y*v.Z - u.Z*v.Y, u.Z*v.X - u.X*v.Z, u.X*v.Y - u.Y*v.X}
|
||||
}
|
||||
|
||||
func (u Vector3) LengthSquared() float64 {
|
||||
return u.Dot(u)
|
||||
}
|
||||
|
||||
func (u Vector3) Length() float64 {
|
||||
return math.Sqrt(u.LengthSquared())
|
||||
}
|
||||
|
||||
func (u Vector3) Normalized() Vector3 {
|
||||
return u.Scale(1.0 / u.Length())
|
||||
}
|
||||
|
||||
func (u Vector3) Round() Vector3 {
|
||||
round := math.Round
|
||||
return Vector3{round(u.X), round(u.Y), round(u.Z)}
|
||||
}
|
||||
|
||||
// i incident, n normal. Both vector should be normalized
|
||||
func Reflect(i Vector3, n Vector3) Vector3 {
|
||||
y := i.Dot(n)
|
||||
return i.Add(n.Scale(2 * y))
|
||||
}
|
||||
|
||||
// Todo : Refract
|
||||
|
||||
// Rodrigues' rotation formula. rotVector should be normalized
|
||||
func rotate(u Vector3, rotVector Vector3, angle float64) Vector3 {
|
||||
cos, sin := math.Cos(angle), math.Sin(angle)
|
||||
vec1 := u.Scale(cos)
|
||||
vec2 := rotVector.Cross(u).Scale(sin)
|
||||
vec3 := rotVector.Scale(rotVector.Dot(u) * (1 - cos))
|
||||
return vec1.Add(vec2).Add(vec3)
|
||||
}
|
||||
|
||||
func (v Vector3) Unpack() (float64, float64, float64) {
|
||||
return v.X, v.Y, v.Z
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue