生成均匀间隔的点网格

时间:2012-05-24 19:11:10

标签: c++ algorithm

我目前有一个生成点网格的算法。它以长度为x(lx)和长度为y(ly)的形式从用户获取输入,以及增量或增量,(dx和{{ 1}})用以分隔点。我需要始终在dylx定义的边界方的边处开始和结束的点。我尝试过几种方法:

边界方块的起始边缘定义为:

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

然后重新计算delta以适合边界框:

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

然后将它们输入到dx = lx / double(numintervalx); dy = ly / double(numintervaly); 循环中,该循环自己生成点:

for

是否有另一种更准确的方法可以使实际网格更接近用户指定的网格,但仍然始终在边缘开始并完成?

3 个答案:

答案 0 :(得分:1)

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

考虑将numpoints重命名为numintervals或者其他东西,因为你实际创建了一个比numpoints更多的点,这很奇怪。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您的输入显然不能保证与lx的{​​{1}}的整数倍兼容,因此您的问题。您必须因此需要兼容的输入,理想情况下,将dx作为输入,nxdx,在您的应用程序中更有意义。

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

lx
相关问题