Skip to content

Instantly share code, notes, and snippets.

@manveru
Created April 30, 2010 07:10
Show Gist options
  • Save manveru/384873 to your computer and use it in GitHub Desktop.
Save manveru/384873 to your computer and use it in GitHub Desktop.
package chipmunk
import "fmt"
type Vect struct {
X, Y Float
}
func vect(x, y Float) *Vect {
return &Vect{x, y}
}
func (v *Vect) Add(o *Vect) *Vect {
return &Vect{v.X + o.X, v.Y + o.Y}
}
func (v *Vect) Neg() *Vect {
return &Vect{-v.X, -v.Y}
}
func (v *Vect) Sub(o *Vect) *Vect {
return &Vect{v.X - o.X, v.Y - o.Y}
}
func (v *Vect) Mult(s Float) *Vect {
return &Vect{v.X * s, v.Y * s}
}
func (v *Vect) Dot(o *Vect) Float {
return v.X*o.X + v.Y*o.Y
}
func (v *Vect) Cross(o *Vect) Float {
return v.X*o.Y - v.Y*o.X
}
func (v *Vect) Perp() *Vect {
return &Vect{-v.Y, v.X}
}
func (v *Vect) RPerp() *Vect {
return &Vect{v.Y, -v.X}
}
func (v *Vect) Project(o *Vect) *Vect {
return o.Mult(v.Dot(o) / o.Dot(o))
}
func (v *Vect) Rotate(o *Vect) *Vect {
return &Vect{v.X*o.X - v.Y*o.Y, v.X*o.Y + v.Y*o.X}
}
func (v *Vect) Unrotate(o *Vect) *Vect {
return &Vect{v.X*o.X + v.Y*o.Y, v.Y*o.X - v.X*o.Y}
}
func (v *Vect) LengthSq() Float {
return v.Dot(v)
}
func (v *Vect) Lerp(o *Vect, t Float) *Vect {
return v.Mult(1.0 - t).Add(o.Mult(t))
}
func (v *Vect) Normalize() *Vect {
return v.Mult(1.0 / v.Length())
}
func (v *Vect) NormalizeSafe() (normalized *Vect) {
if v.X == 0.0 && v.Y == 0.0 {
normalized = &Vect{0.0, 0.0}
} else {
normalized = v.Normalize()
}
return
}
func (v *Vect) Clamp(length Float) (clamped *Vect) {
if v.Dot(v) > length*length {
clamped = v.Normalize().Mult(length)
} else {
clamped = v
}
return
}
func (v *Vect) LerpConst(o *Vect, d Float) *Vect {
return v.Add(o.Sub(v).Clamp(d))
}
func (v *Vect) Dist(o *Vect) Float {
return v.Sub(o).Length()
}
func (v *Vect) DistSq(o *Vect) Float {
return v.Sub(o).LengthSq()
}
func (v *Vect) Near(o *Vect, dist Float) bool {
return v.DistSq(o) < dist*dist
}
func (v *Vect) Length() Float {
return v.Dot(v).Sqrt()
}
func (v *Vect) Slerp(o *Vect, t Float) (slerp *Vect) {
omega := v.Dot(o).Acos()
if !(omega.IsNaN() || omega == 0.0) {
denom := 1.0 / omega.Sin()
slerp = v.Mult(((1.0 - t) * omega).Sin() * denom).
Add(o.Mult(((t * omega) * denom).Sin()))
} else {
slerp = v
}
return
}
func (v *Vect) SlerpConst(o *Vect, a Float) *Vect {
angle := v.Dot(o).Acos()
return v.Slerp(o, a.Min(angle)/angle)
}
func VectorForAngle(a Float) *Vect {
return &Vect{a.Cos(), a.Sin()}
}
func (v *Vect) ToAngle() Float {
return v.Y.Atan2(v.X)
}
func (v *Vect) String() string {
return fmt.Sprintf("(%.3f, %.3f)", v.X, v.Y)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment