#pragma once #include struct double3 { double data[3]; double3() {} double3(const double x, const double y, const double z) { data[0] = x; data[1] = y; data[2] = z; } double& operator[](int i) {return data[i];} const double operator[](int i) const {return data[i];} double3& operator=(const double3& a) { data[0] = a.data[0]; data[1] = a.data[1]; data[2] = a.data[2]; return *this; } double3& operator+=(const double3& a) { data[0] += a.data[0]; data[1] += a.data[1]; data[2] += a.data[2]; return *this; } double3& operator-=(const double3& a) { data[0] -= a.data[0]; data[1] -= a.data[1]; data[2] -= a.data[2]; return *this; } double3& operator/=(const double& c) { data[0] /= c; data[1] /= c; data[2] /= c; return *this; } double norm2() const { return data[0]*data[0]+data[1]*data[1]+data[2]*data[2]; } double norm() const { return sqrt(data[0]*data[0]+data[1]*data[1]+data[2]*data[2]); } operator double*() {return data;} }; inline double3 operator*(const double& c, const double3& a) { return double3(a.data[0]*c, a.data[1]*c, a.data[2]*c); } inline double3 operator*(const double3& a, const double& c) { return double3(a.data[0]*c, a.data[1]*c, a.data[2]*c); } inline double operator*(const double3& a, const double3& b) { return a.data[0]*b.data[0]+a.data[1]*b.data[1]+a.data[2]*b.data[2]; } inline double3 operator/(const double3& a, const double& c) { return double3(a.data[0]/c, a.data[1]/c, a.data[2]/c); } inline double3 operator+(const double3& a, const double3& b) { return double3(a.data[0]+b.data[0], a.data[1]+b.data[1], a.data[2]+b.data[2]); } inline double3 operator-(const double3& a, const double3& b) { return double3(a.data[0]-b.data[0], a.data[1]-b.data[1], a.data[2]-b.data[2]); }