Hello Jiaqi
I was interested in this some years back though I didnt pursue it after some initial attempt.
See this
I tried writing an fespace based on FE_DGPNonparametric which does not use a mapping and the shape functions are directly evaluated in physical space. I attempted it here
You need to modify fevalues so that it can use solution on one cell but evaluate it on a different cell. See the reinit functions
I dont remember clearly but this seemed to be working fine. Only problem was that the shape functions were not orthogonal.
I used this fe_dgt space here
There may be other discussion in mailing list related to this which I have forgotten now.
It should be possible to add a similar reinit function to FE_DGP with MappingCartesian, and achieve what you want. The shape functions would be orthogonal. So one would use it as (some syntax could be wrong here)
fe_values.reinit(cell);
std::vector<Point<dim>>& points = fe_values.get_quadrature_points();
fe_values_nbr.reinit(nbr_cell, points);
The last reinit function should convert "points" to local coordinates on nbr_cell and evaluate whatever it wants.
Or you can modify my fe_dgt to use Legendre polynomials.
On general grids, this is more difficult if you want to have orthogonal shape functions. Only way would be to implement some gram-schmidt process. If you dont care for orthogonality, then something like fe_dgt above works.
Best
Praveen