struct vec3 {
    float x, y, z;

    float norm() const;
    void display() const;
    void normalize();
    
    float dot(vec3 const& b) const;
    vec3 cross(vec3 const& b) const;
};

// Methods
float vec3::dot(vec3 const& b) const {
    return x * b.x + y * b.y + z * b.z;
}
vec3 vec3::cross(vec3 const& b) const
{
    return { y * b.z - z * b.y, z * b.x - x * b.z, x * b.y - y * b.x };
}

// Functions
float dot(vec3 const& a, vec3 const& b) {
    return a.x * b.x + a.y * b.y + a.z * b.z;
}
vec3 cross(vec3 const& a, vec3 const& b) {
    return { a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x };
}