From b7814d6822d03517fc846b95865965618be7d406 Mon Sep 17 00:00:00 2001 From: Nat Lasseter Date: Mon, 24 Jun 2024 16:01:18 +0100 Subject: Initial Commit, finished Chapter 6 --- vec3.go | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 vec3.go (limited to 'vec3.go') diff --git a/vec3.go b/vec3.go new file mode 100644 index 0000000..65d14e5 --- /dev/null +++ b/vec3.go @@ -0,0 +1,65 @@ +package main + +import ( + "fmt" + maths "math" +) + +type Vec3 struct { + X, Y, Z float64 +} + +func (v Vec3) Neg() Vec3 { + return Vec3{-v.X, -v.Y, -v.Z}; +} + +func (v Vec3) Add(w Vec3) Vec3 { + return Vec3{v.X + w.X, v.Y + w.Y, v.Z + w.Z}; +} + +func (v Vec3) Sub(w Vec3) Vec3 { + return Vec3{v.X - w.X, v.Y - w.Y, v.Z - w.Z}; +} + +func (v Vec3) Mul(w Vec3) Vec3 { + return Vec3{v.X * w.X, v.Y * w.Y, v.Z * w.Z}; +} + +func (v Vec3) Div(w Vec3) Vec3 { + return Vec3{v.X / w.X, v.Y / w.Y, v.Z / w.Z}; +} + +func (v Vec3) MagSqr() float64 { + return v.Dot(v); +} + +func (v Vec3) Mag() float64 { + return maths.Sqrt(v.MagSqr()); +} + +func (v Vec3) Unit() Vec3 { + m := v.Mag(); + return Vec3{v.X / m, v.Y / m, v.Z / m}; +} + +func (v Vec3) Dot(w Vec3) float64 { + return v.X * w.X + v.Y * w.Y + v.Z * w.Z; +} + +func (v Vec3) Cross(w Vec3) Vec3 { + return Vec3{v.Y * w.Z - v.Z * w.Y, + v.Z * w.X - v.X * w.Z, + v.X * w.Y - v.Y * w.X}; +} + +func (v Vec3) ToPPM() string { + r := uint8(255.999 * v.X); + g := uint8(255.999 * v.Y); + b := uint8(255.999 * v.Z); + + return fmt.Sprintf("%3d %3d %3d", r, g, b); +} + +func Splat(f float64) Vec3 { + return Vec3{f, f, f}; +} -- cgit v1.2.1