aboutsummaryrefslogtreecommitdiff
path: root/vec3.go
diff options
context:
space:
mode:
authorNat Lasseter <user@4574.co.uk>2024-06-24 16:01:18 +0100
committerNat Lasseter <user@4574.co.uk>2024-06-24 16:01:18 +0100
commitb7814d6822d03517fc846b95865965618be7d406 (patch)
tree2afc2a5de6d3ca82f465f51686d47dc032d2efb4 /vec3.go
Initial Commit, finished Chapter 6
Diffstat (limited to 'vec3.go')
-rw-r--r--vec3.go65
1 files changed, 65 insertions, 0 deletions
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};
+}