from vpython import vertex, vector, quad, scene, color
import autograd.numpy as np
from autograd import grad
scene.width = scene.height = 600
scene.scale = (1,1,0.4)
def plot_fxy(fxy,xydom,nx=50,ny=50,color=color.green):
xmi,xma,ymi,yma=xydom
xx = np.linspace(xmi,xma,nx+1)
yy = np.linspace(ymi,yma,ny+1)
fdx, fdy = grad(fxy,0), grad(fxy,1)
verts = np.zeros((ny+1,nx+1),dtype=object)
for yi,y in enumerate(yy):
for xi,x in enumerate(xx):
verts[yi,xi] = vertex(pos=vector(x,y,fxy(x,y)), normal=vector(-fdx(x,y),-fdy(x,y),1),
shininess= 0,color=color)
for yi in range(ny):
for xi in range(nx):
quad(v0=verts[yi,xi], v1=verts[yi,xi+1], v2=verts[yi+1,xi+1], v3=verts[yi+1,xi])
# ---------------------------------- example function and plot -------------------------------------------------
mex_hat = lambda x,y: np.sin(1-x**2-y**2)/((x**2+y**2)+1)
plot_fxy(mex_hat,[-2,2,-2,2],40,50)