0

我希望能够以设定的步长遍历网格元素。这个问题的有趣之处在于网格将被旋转。我开发了一种算法来做到这一点,并且在某些情况下它是成功的。下图说明了问题:

在此处输入图像描述

问题的条件是,将提供一个网格间距,它是网格长度和宽度的一个因素(作为旁注,网格可以是矩形的)。算法必须遍历网格并打印出它的位置。这是一些代码及其工作示例:

int main() {
vector< vector<double> > bound;
vector<double> point;
point.push_back(0);
point.push_back(4);

bound.push_back(point);
point[0] = 6; point[1] = 10;
bound.push_back(point);
point[0] = 4; point[1] = 0;
bound.push_back(point);
point[0] = 10; point[1] = 6;
bound.push_back(point);

double d = 0.5;
double x, y;
int countx = 0, county = 0;
for (double i = bound[0][0]; i < bound[2][0]; i+=d) {
    //std::cout << "I: " << i << std::endl;
    for (double j = bound[0][1]; j < bound[1][1]; j+=d) {
        //std::cout << "J: " << j << std::endl;
        x = i+d+(double)county*d;
        y = j-(double)countx*d;
        ++county;
        std::cout << "i, j, x and y: " << i << "\t" << j << "\t" << x << "\t" << y << std::endl;
    }
    std::cout << "new Row--------------------\n";
    ++countx;
    county = 0;
}   
}

上面的代码可以正常工作并正确打印网格元素,即:

x and y: 4, 0.5
x and y: 4.5, 1
etc.

但是,当尝试带边界的矩形时:

[(0.5, 6), (3, 8.5), (5.5, 1), (8, 3.5)]

步长 (d) 为 1

它迭代到矩形边界之外。我可以看到为什么会发生这种情况,for 循环中的迭代器条件不会包含它,因为额外的 +d。

我的问题是,有没有更好的方法来解决这个问题,我将如何解决?

有谁知道这是否已经实现过并且有一些源代码?

为帮助喝彩。

4

1 回答 1

0

我最终采用的方法是通过毕达哥拉斯规则在两个边上计算矩形的长度和宽度。然后我在一个虚拟矩形上制作了一个网格,该矩形与其原点的底角对齐。然后通过使用预先开发的矩阵旋转和平移库,我通过将它们平移到左下角的位移并将它们旋转到矩形的计算角度来单独转换这些点。

这类似于上述解决方案,但使用了完整的变换矩阵。答案最终比我想象的要简单。

谢谢您的帮助。

于 2012-05-01T05:07:12.830 回答