我希望能够以设定的步长迭代网格元素。这个问题的有趣部分是网格将被旋转。我已经开发了一种算法来做到这一点,并且在某些情况下它是成功的。下图说明了问题:
问题的条件是将提供网格间距,该网格间距是网格长度和宽度的因子(作为侧边注释,网格可以是矩形)。算法必须遍历网格并打印出它的位置。以下是一些代码及其工作示例:
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
迭代到矩形边界之外。我可以看到为什么会发生这种情况,因为额外的+ d,for循环中的迭代器条件将不包含它。
我的问题是,有没有更好的方法来解决这个问题,我将如何解决这个问题?
有没有人知道这是否已经实现过并且有一些源代码?
欢呼帮助。
本
答案 0 :(得分:0)
我最终得到的方法是通过毕达哥拉斯规则在两侧计算矩形的长度和宽度。然后我在一个虚拟矩形上做了一个网格,它与原点的底角对齐。然后通过使用预先开发的库进行矩阵旋转和平移,我通过将它们转换为左下角的位移并将它们旋转到矩形的计算角度来单独转换点。
这与上述解决方案类似,但使用完整的转换矩阵。答案最终变得更简单,然后我认为会是。
感谢您的帮助。