aboutsummaryrefslogtreecommitdiff
path: root/src/Vector.ts
diff options
context:
space:
mode:
authorJames Barnett <noreply@jamesbarnett.xyz>2022-01-01 21:21:52 +0000
committerJames Barnett <noreply@jamesbarnett.xyz>2022-01-01 21:21:52 +0000
commit7ad1b7efabea1349107669a432e6c88305f8d825 (patch)
tree8de34e4b3e20e4e8c0c01578ce0b0cfaa46cc6cf /src/Vector.ts
parentdc5e815da04d7c377b3cb51558d6fe7b8e0fd7c0 (diff)
downloadjs-raytracer-7ad1b7efabea1349107669a432e6c88305f8d825.tar.xz
js-raytracer-7ad1b7efabea1349107669a432e6c88305f8d825.zip
Implement basic ray tracing
Diffstat (limited to 'src/Vector.ts')
-rw-r--r--src/Vector.ts36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/Vector.ts b/src/Vector.ts
new file mode 100644
index 0000000..3cebf6d
--- /dev/null
+++ b/src/Vector.ts
@@ -0,0 +1,36 @@
+export class Vector {
+ constructor(readonly x: number, readonly y: number, readonly z: number) {}
+
+ add(v: Vector): Vector {
+ return new Vector(this.x + v.x, this.y + v.y, this.z + v.z);
+ }
+
+ addScalar(n: number): Vector {
+ return new Vector(this.x + n, this.y + n, this.z + n);
+ }
+
+ subtract(v: Vector): Vector {
+ return new Vector(this.x - v.x, this.y - v.y, this.z - v.z);
+ }
+
+ multiply(n: number): Vector {
+ return new Vector(this.x * n, this.y * n, this.z * n);
+ }
+
+ dotProduct(v: Vector): number {
+ return this.x * v.x + this.y * v.y + this.z * v.z;
+ }
+
+ normalise(): Vector {
+ const vecLength = this.norm();
+ return new Vector(
+ this.x / vecLength,
+ this.y / vecLength,
+ this.z / vecLength
+ );
+ }
+
+ norm(): number {
+ return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);
+ }
+}