SBasis2d partial_derivative(SBasis2d const &f, int dim) { SBasis2d result; for(unsigned i = 0; i < f.size(); i++) { result.push_back(Linear2d(0,0,0,0)); } result.us = f.us; result.vs = f.vs; for(unsigned i = 0; i < f.us; i++) { for(unsigned j = 0; j < f.vs; j++) { Linear2d lin = f.index(i,j); Linear2d dlin(lin[1+dim]-lin[0], lin[1+2*dim]-lin[dim], lin[3-dim]-lin[2*(1-dim)], lin[3]-lin[2-dim]); result[i+j*result.us] += dlin; unsigned di = dim?j:i; if (di>=1){ float motpi = dim?-1:1; Linear2d ds_lin_low( lin[0], -motpi*lin[1], motpi*lin[2], -lin[3] ); result[(i+dim-1)+(j-dim)*result.us] += di*ds_lin_low; Linear2d ds_lin_hi( lin[1+dim]-lin[0], lin[1+2*dim]-lin[dim], lin[3]-lin[2-dim], lin[3-dim]-lin[2-dim] ); result[i+j*result.us] += di*ds_lin_hi; } } } return result; }