A few weeks back, someone asked me a question that, as someone who has worked with computer graphics quite a bit, I should have instantly known the answer to: how to compute a dot product of two vectors. Instead, I floundered for an answer and tried just about every way but the correct way I could conceive of because the correct way ‘didn’t look right’ to me. If you’ve ever spelled a word and then thought, ‘that doesn’t look right’ even though you have spelled it correctly, you’ll know what I mean.
In my defense, I had been running low on sleep and energy for a few weeks at that point due to working on a proposal. So not only was I tired, I was cold on writing code. Worse, I hadn’t written a line of graphics-related code in months.
These are really just excuses though. Eventually I slogged through to the correct answer, but I felt like I had completely misrepresented myself to this person.
So, without further ado, here is an example of how to compute a dot product between two vectors in C++:
vec4.h
#ifndef ____vec4__ #define ____vec4__ class vec4 { private: float x, y, z, w; public: vec4(float x, float y, float z, float w); float dot(vec4 v); }; #endif /* defined(____vec4__) */ |
vec4.cpp
#include "vec4.h" #include <stdio.h> int main() { vec4 v1 = vec4(5.0f, 4.0f, 3.0f, 1.0f); vec4 v2 = vec4(1.0f, 2.0f, 3.0f, 1.0f); float dotProduct = v1.dot(v2); fprintf(stdout, "dot product: %.2f\n", dotProduct); } vec4::vec4(float x, float y, float z, float w) { this->x = x; this->y = y; this->z = z; this->w = w; } float vec4::dot(vec4 v) { float sum = 0.0f; sum += this->x*v.x; sum += this->y*v.y; sum += this->z*v.z; sum += this->w*v.w; return sum; } |
There are a dozen other methods that should be added to this class as well, like a cross-product, conversion to a unit vector, or a method for determining the angle between this vector and another, but it occurred to me that there are plenty of C++ libraries out there that already do this. However, is there one for Swift? I’m not sure – there are the beginnings of a Vector2D in the Swift Programming Language Guide, but it is clearly not finished.
I decided I’d mirror the functionality of the above C++ class in a Swift class in a playground as a start in the direction of creating a reusable vector class:
class Vector4D { var x, y, z, w : Float; init(var x : Float, var y : Float, var z : Float, var w : Float) { self.x = x; self.y = y; self.z = z; self.w = w; } convenience init() { self.init(x: 0.0, y: 0.0, z: 0.0, w: 0.0); } func dot(vec : Vector4D) -> Float { var sum : Float = 0.0; sum += self.x*vec.x; sum += self.y*vec.y; sum += self.z*vec.z; sum += self.w*vec.w; return sum; } } var v1 : Vector4D = Vector4D(x: 5.0, y: 4.0, z: 3.0, w: 1.0); var v2 : Vector4D = Vector4D(x: 1.0, y: 2.0, z: 3.0, w: 1.0); v1.dot(v2); |
The code is remarkably similar to the C++ code, but there’s definitely some new flavors in there too. I’ll come back to this later if it turns out that I need something like this.