Я недавно играл с Bicubic Interpolation, так как я хочу генерировать землю, основываясь на реальных картах высот внутри Minecraft. Причина, по которой я использую интерполяцию, заключается в том, что я хотел бы сделать мир более подробным. После много исследований и много проб и ошибок, я решил обратиться сюда. :)Java 2D-массив Бикубическая интерполяция
Из-за ограниченной памяти я не могу масштабировать изображение при запуске и сохранять его загруженным, я должен сделать интерполяцию «на лету».
Я, кажется, получил кубическую интерполяцию к работе, как показано здесь: Visualisation of the interpolation Однако, я не могу получить бикубические работать. Для целей тестирования, я использую маленькое изображение, и масштабирование на 4. Это то, что делает этот код: Input -> Output
Это мой текущий код:
public static double cubicInterpolate(double[] points, double x, double scale)
{
x /= scale;
double inBetweenPoint = x;
int xInHeightmap = (int) x;
inBetweenPoint -= xInHeightmap;
double beforePoint1 = safe(points, xInHeightmap - 1);
double point1 = safe(points, xInHeightmap);
double point2 = safe(points, xInHeightmap + 1);
double afterPoint2 = safe(points, xInHeightmap + 2);
double p = (afterPoint2 - point2) - (beforePoint1 - point1);
double q = (beforePoint1 - point1) - p;
double r = point2 - beforePoint1;
double s = point1;
return (p * Math.pow(inBetweenPoint, 3)) + (q * Math.pow(inBetweenPoint, 2)) + (r * inBetweenPoint) + s;
}
public static double bicubicInterpolate(double[][] points, double x, double y, double scale)
{
x /= scale;
double inBetweenPoint = x;
int xInHeightmap = (int) x;
inBetweenPoint -= xInHeightmap;
double beforePoint1 = cubicInterpolate(safe(points, xInHeightmap - 1), y, scale);
double point1 = cubicInterpolate(safe(points, xInHeightmap), y, scale);
double point2 = cubicInterpolate(safe(points, xInHeightmap + 1), y, scale);
double afterPoint2 = cubicInterpolate(safe(points, xInHeightmap + 2), y, scale);
return cubicInterpolate(new double[]{beforePoint1, point1, point2, afterPoint2}, inBetweenPoint + 1, scale);
}
public static double[] safe(double[][] p, int i)
{
return p[Math.max(0, Math.min(i, p.length - 1))];
}
public static double safe(double[] p, int i)
{
return p[Math.max(0, Math.min(i, p.length - 1))];
}
Спасибо за вашу помощь :)
Привет! Спасибо за помощь, но у меня все еще возникают проблемы с выходным изображением, это изображение, которое я получаю сейчас: http://prntscr.com/9990d6 – gegy1000
Это может быть проблема с кодом, генерирующим изображение, а не с интерполяцией сам. Можете ли вы разместить соответствующий код? – WorldSEnder
О, это вы! : P Вот он: http://pastebin.com/SuK05s7p – gegy1000