সম্পাদনা: দুঃখিত, জেসন মন্তব্যে যেমন উল্লেখ করেছেন, নীচের উত্তরটি স্প্লাইজ সম্পর্কে নয়, দ্বি-মাত্রিক লিনিয়ার (বা বিলাইনার ) ইন্টারপোলেশন সম্পর্কে। যদি কেউ এটি তথ্যবহুল মনে করে তবে আমি এটি মুছে ফেলার জন্য বেছে নিচ্ছি।
আমি একটি সাধারণ 3 ডি ভূখণ্ড তৈরি করেছি এবং তারপরে আমার চরিত্রটি এই অঞ্চলজুড়ে চলতে চেয়েছিল। সুতরাং, ভূখণ্ডের যে কোনও বিন্দুতে চরিত্রটির উচ্চতা সন্ধান করতে, আমি বিলিনিয়ার ইন্টারপোলেশন ব্যবহার করেছি ।
বিলিনিয়ার অন্তরঙ্গকরণের জন্য আমি জাভা কোডটি এখানে ব্যবহার করছি:
/**
* 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},
};
}
}
নোট করুন যে বাইকুবিক ইন্টারপোলেশন দূরবর্তী পয়েন্টগুলি জুড়ে মসৃণ বা আরও বাস্তবসম্মত প্রবৃত্তি উপস্থাপন করতে পারে; তবে আমি বিলিনিয়ারের সাথে যেতে বেছে নিই কারণ আমার ঘন গ্রিড রয়েছে, অনুকূলিত করার প্রয়াসে (সম্ভবত অকাল)।