docs: void interpolateDeformedPoint(float v_x , float v_y , Point2D_F32 deformed ) {
  
  		// sample the closest point and x+1,y+1
  		int x0 = (int)v_x;
  		int y0 = (int)v_y;
  		int x1 = x0+1;
  		int y1 = y0+1;
  
  		// make sure the 4 sample points are in bounds
  		if( x1 >= gridCols )
  			x1 = gridCols-1;
  		if( y1 >= gridRows )
  			y1 = gridRows-1;
  
  		// weight along each axis
  		float ax = v_x - x0;
  		float ay = v_y - y0;
  
  		// bilinear weight for each sample point
  		float w00 = (1.0f - ax) * (1.0f - ay);
  		float w01 = ax * (1.0f - ay);
  		float w11 = ax * ay;
  		float w10 = (1.0f - ax) * ay;
  
  		// apply weights to each sample point
  		Point2D_F32 d00 = getGrid(y0,x0).deformed;
  		Point2D_F32 d01 = getGrid(y0,x1).deformed;
  		Point2D_F32 d10 = getGrid(y1,x0).deformed;
  		Point2D_F32 d11 = getGrid(y1,x1).deformed;
  
  		deformed.set(0,0);
  		deformed.x += w00 * d00.x;
  		deformed.x += w01 * d01.x;
  		deformed.x += w11 * d11.x;
  		deformed.x += w10 * d10.x;
  
  		deformed.y += w00 * d00.y;
  		deformed.y += w01 * d01.y;
  		deformed.y += w11 * d11.y;
  		deformed.y += w10 * d10.y;
  	}