class Vec3 {
    public:
    float x, y, z;

    Vec3(float x, float y, float z) {
        this->x = x;
        this->y = y;
        this->z = z;
    }

    Vec3 add (Vec3 other) {
        Vec3 result (x + other.x, y + other.y, z + other.z);
        return result;
    }

    Vec3 subtract (Vec3 other) {
        Vec3 result (x - other.x, y - other.y, z - other.z);
        return result;
    }

    Vec3 scalar (float scalar) {
        Vec3 result (x * scalar, y * scalar, z * scalar);
        return result;
    }

    float dot (Vec3 other) {
        float result (x * other.x + y * other.y + z * other.z);
        return result;
    }

    Vec3 cross (Vec3 other) {
        Vec3 result (y*other.z - z*other.y, z*other.x - x*other.z, x*other.y - y*other.x);
        return result;
    }

    float length () {
        float result = sqrt(x*x + y*y + z*z);
        return result;
    }

    Vec3 normalize () {
        float len = sqrt(x*x + y*y + z*z);
        Vec3 result (x / len, y / len, z / len);
        return result;
    }
};