Я бы создал адаптер вокруг вашего 2D-объекта, который перехватывает запрошенную позицию окна, обращается к базовому 2D-объекту и возвращает соответственно сконструированный результат.Таким образом, вы можете использовать любую базовую реализацию (например, ту, на которую вы ссылались) и получить желаемый результат.
Подумайте в терминах следующего псевдокода:
View getView(int leftX, int topY) {
if (leftX >= 0 and
topY >= 0 and
leftX <= underlying.width() - viewWidth and
topX <= underlying.height() - viewHeight)
{
return underlying.getView(leftX, topY);
}
// else make your own view and populate it
View view = new View()
for (int i = 0; i < viewWidth; ++i)
for (int j = 0; j < viewHeight; ++j)
view.set(i, j) = underlying.get((leftX + i) % underlying.width(), (topY + j) % underlying.height())
}
Если вы закончитеИспользуя этот код, убедитесь, что по модулю отрицательные индексы дают положительный результат.Если нет, используйте viewWidth - negative_modulo
, чтобы получить правильный индекс.