0

我目前有一个生成点网格的算法。lx它以 x ( ) 的长度和 y ( )的长度的形式从用户那里获取输入,以及将点间隔的ly增量或增量 (dx和)。dy我需要这些点始终在 和定义的边界正方形的边缘开始和lx结束ly。我尝试了几种方法:

边界正方形的起始边缘定义为:

double startx = lx / -2.0, starty = ly / -2.0;

我的第一种方法确定点数和轮数:

int numintervalx = round(lx / dx), numintervaly = round(ly / dy);

我的第二种方法确定点数并使用大于点数的最接近的整数:

int numintervalx = ceil(lx / dx), numintervaly = ceil(ly / dy);

我的第三种方法确定点数并使用小于点数的最接近整数:

int numintervalx = floor(lx / dx), numintervaly = floor(ly / dy);

然后重新计算增量以适应边界框:

dx = lx / double(numintervalx);
dy = ly / double(numintervaly);

然后将这些输入到一个for循环中,该循环自己生成点:

for (int i = 0; i <= numintervaly; i++)
  for (int j = 0; j <= numintervalx; j++)
  {
    double point[3] = {startx + dx * j, starty + dy * i, 0};
  }

是否有另一种更准确的方法可以使实际网格更接近用户指定的网格,仍然总是在边缘开始和结束?

4

3 回答 3

1

将整数转换视为添加错误。在这种情况下,最小化转换为整数时添加的误差的方法是四舍五入。最坏的情况是,如果用户输入的值使得 lx/dx 为 something.5,这意味着舍入误差为 0.5。鉴于您的问题,这是您能做的最好的。

考虑将 numpoints 重命名为 numintervals 或其他内容,因为实际上您创建的点比 numpoints 多一个,这很奇怪。

于 2012-05-24T19:42:49.607 回答
0

要求用户分别为您提供 和 的值,它们是lxly的倍数。当然,这需要一些基本的输入验证,但它会保证实际的网格与用户指定的网格完全相同,点总是在边缘开始和结束。dxdy

于 2012-05-24T19:17:12.900 回答
0

您的输入显然不能保证与lx的整数倍兼容dx,因此您的问题。因此,您必须要求兼容的输入,理想情况下,将或者nx作为输入,或者dxlx您的应用程序中更有意义。

或者,您可以仅将用户输入视为指南,即采取

nx = int(ceil(lx/dx));    // get suitable number of points
dx = lx/nx;               // set suitable spacing to fit range exactly
于 2012-05-24T19:30:39.193 回答