二维阵列算法的圆形滑动窗口

时间:2012-02-15 23:41:35

标签: c# algorithm sliding-window

This question solves half of my problem 因为我的滑动窗可以移到桌子外面, 例如对于3x3窗口,窗口的两列可以位于表的左端 并且一列将在右端。这些图像显示窗口向左移动

enter image description here enter image description here enter image description here

我需要这个滑动窗口的算法,上面提到的问题中的滑动窗口不会移到桌子外面。

2 个答案:

答案 0 :(得分:2)

我会在你的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获取正确的索引。

答案 1 :(得分:2)

您可以使用模运算(%)来限制索引。

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]);
    }
}