スライディング ウィンドウはテーブルの外に移動できるため、この質問で問題の半分が解決 します。たとえば、3x3 ウィンドウの場合、ウィンドウの 2 つの列がテーブルの左端にあり、1 つの列が右端にある可能性があります。これらの画像は、ウィンドウが左に移動していることを示しています
このスライディング ウィンドウにはアルゴリズムが必要です。前述の質問のスライディング ウィンドウはテーブルの外に移動しません。
スライディング ウィンドウはテーブルの外に移動できるため、この質問で問題の半分が解決 します。たとえば、3x3 ウィンドウの場合、ウィンドウの 2 つの列がテーブルの左端にあり、1 つの列が右端にある可能性があります。これらの画像は、ウィンドウが左に移動していることを示しています
このスライディング ウィンドウにはアルゴリズムが必要です。前述の質問のスライディング ウィンドウはテーブルの外に移動しません。
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
して正しいインデックスを取得します。
%
インデックスを限定するためにモジュロ演算 ( ) を使用できます。
Size arraySize = new Size(20, 15);
Size windowSize = new Size(3, 3);
double[,] array = new double[arraySize.Width, arraySize.Height];
// Set the location of the window
Point windowLocation = new Point(18, 14);
for (int x = 0; x < windowSize.Width; x++) {
for (int y = 0; y < windowSize.Height; y++) {
DoSomethingWith(array[(windowLocation.X + x) % arraySize.Width,
(windowLocation.Y + y) % arraySize.Height]);
}
}