Chỉnh sửa: Xin lỗi, như Jason chỉ ra trong nhận xét, câu trả lời sau đây không phải là về phép chia mà là về phép nội suy tuyến tính hai chiều (hoặc song tuyến tính ). Tôi đang chọn không xóa nó trong trường hợp ai đó có thể tìm thấy nó nhiều thông tin.
Tôi đã tạo một địa hình 3D đơn giản và sau đó muốn nhân vật của tôi đi bộ qua địa hình. Vì vậy, để tìm chiều cao của nhân vật tại bất kỳ điểm nào trên địa hình, tôi đã sử dụng phép nội suy song tuyến tính .
Đây là mã Java tôi sử dụng cho phép nội suy song tuyến tính:
/**
* Interpolates the value of a point in a two dimensional surface using bilinear spline interpolation.
* The value is calculated using the position of the point and the values of the 4 surrounding points.
* Note that the returned value can be more or less than any of the values of the surrounding points.
*
* @param p A 2x2 array containing the heights of the 4 surrounding points
* @param x The horizontal position, between 0 and 1
* @param y The vertical position, between 0 and 1
* @return the interpolated height
*/
private static float bilinearInterpolate (float[][] p, float x, float y) {
return p[0][0]*(1.0f-x)*(1.0f-y) + p[1][0]*x*(1.0f-y) + p[0][1]*(1.0f-x)*y + p[1][1]*x*y;
}
/**
* Finds a 2-dimensional array of the heights of the four points that
* surround (x,y).
*
* Uses the member variable "verts", an 2D array of Vertex objects which have
* a member "height" that is the specific vertex's height.
*/
private float[][] nearestFour(float x, float y) {
int xf = (int) Math.floor(x);
int yf = (int) Math.floor(y);
if(xf < 0 || yf < 0 || xf > verts[0].length-2 || yf > verts.length-2) {
// TODO do something better than just return 0s
return new float[][]{
{0.0f, 0.0f},
{0.0f, 0.0f}
};
} else {
return new float[][]{
{verts[yf][xf].height, verts[yf][xf+1].height},
{verts[yf+1][xf].height, verts[yf+1][xf+1].height},
};
}
}
Lưu ý rằng phép nội suy hai chiều có thể trình bày nội suy mượt mà hơn hoặc thực tế hơn trên các điểm ở xa; nhưng tôi chọn đi với song tuyến vì tôi có một mạng lưới dày đặc, trong một nỗ lực để tối ưu hóa (có lẽ là sớm).