Это некоторые отвратительные имена, которые вы выбрали, но, по крайней мере, они определены.
Я думаю, вы хотите пройти через (x, y) в [0 ... 1] x [0 ... 1] реальном координатном пространстве; то есть нижний правый угол A должен захватывать значение из нижнего правого угла B, а также для середины верхнего левого угла и т. д. Это означает, что вы должны думать о внешних краях точек в вашем массиве как о ширине 0 значения точечных выборок по краям поля [0 ... 1] x [0 ... 1]; то есть, если у вас есть массив 3х3, есть одна точка (0,5,0,5), а остальные - вдоль ребра.
Я предполагаю, что в вашем 2d B массиве есть реальные значения, так что имеет смысл интерполировать; потому что массивы имеют разные размеры
Вот схема перехода с
indexA -> (posAX, posAY) -> (x, y) -> (fracBX, fracBY) -> (по интерполяции ближайшего соседа) из ArrayB
Важно: (fracBX, fracBY) - это действительные координаты в поле [0 ... SizeBX-1] x [0 ... SizeBY-1].
Давайте сделаем это по одному шагу за раз. Предполагая, что я вас понял, значения находятся в памяти в порядке слева-> справа, сверху-> снизу (чтение на английском), так же, как стандартные массивы Си. Тогда:
unsigned posAX=indexA%SizeAX;
unsigned posAY=indexA/SizeAX;
Теперь давайте сопоставим (x, y):
double x=posAX/(SizeAX-1.0); // we get double division when we subtract by 1.0
double y=posAY/(SizeAY-1.0);
Теперь к (fracBX, fracBY), где 0 <= fracBX <= SizeBX и 0 <= fracBY <= SizeBY: </p>
double fracBX=x*(SizeBX-1);
double fracBY=y*(SizeBY-1);
Теперь, чтобы интерполировать между (до 4) ближайшими целочисленными точками в массиве B:
unsigned intBX=(unsigned)fracBX;
double aBX=fracBX-intBX;
unsigned intBY=(unsigned)fracBY;
double aBY=fracBY-intBY;
double *bv=ArrayB+(intBX*sizeBY)+intBY;
#define INTERP(alpha,v1,v2) ((1-alpha)*v1+alpha*v2)
#define INTERPI(alpha,i1,i2) (alpha>0 ? INTERP(alpha,bv[i1],bv[i2] : bv[i1])
double v0=INTERPI(aBX,0,1);
double value=fracBY>0 ? INTERP(aBY,v0,INTERPI(aBX,sizeBY,sizeBY+1)) : v0;
значение - ваш ответ. Проверки для дробных позиций aBX и aBY, равных 0, необходимы для предотвращения доступа к значениям за пределами массива (что может вызвать ошибку сегмента, даже если значения игнорируются умножением на 0). Или вы можете упростить задачу, выделив на 1 строку / столбец больше, чем нужно.
bv [0] - массив ArrayB [intBX] [intBY], bv [1] - один справа, bv [sizeBY] - один вниз, а bv [sizeBY + 1] - один вниз и вправо. (aBX, aBY) - еще одна точка в [0 ... 1] x [0 ... 1], но на этот раз она ограничена этими четырьмя соседними точками в ArrayB.