public T Project(T v) { int dim = v.Dimension; v = VecX.Sub(v, m_origin); double[] nvArr = new double[dim]; for (int i = 0; i < m_basis.Length; i++) { T bv = m_basis[i]; double d = VecX.Dot(v, bv); for (int j = 0; j < dim; j++) { nvArr[j] += d * bv[j]; } } T nv = new T(); for (int i = 0; i < dim; i++) { nv[i] = nvArr[i] + m_origin[i]; } return(nv); }