我目前有一个生成点网格的算法。它以长度为x(lx
)和长度为y(ly
)的形式从用户获取输入,以及增量或增量,(dx
和{{ 1}})用以分隔点。我需要始终在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);
然后重新计算delta以适合边界框:
int numintervalx = floor(lx / dx), numintervaly = floor(ly / dy);
然后将它们输入到dx = lx / double(numintervalx);
dy = ly / double(numintervaly);
循环中,该循环自己生成点:
for
是否有另一种更准确的方法可以使实际网格更接近用户指定的网格,但仍然始终在边缘开始并完成?
答案 0 :(得分:1)
将整数转换视为添加错误。在这种情况下,最小化转换为整数时添加的错误的方法是舍入。最坏的情况是用户输入的值使得lx / dx为5,这意味着舍入误差为0.5。鉴于您的问题,这是您能做的最好的事情。
考虑将numpoints重命名为numintervals或者其他东西,因为你实际创建了一个比numpoints更多的点,这很奇怪。
答案 1 :(得分:0)
要求用户为您提供lx
和ly
的值,分别是dx
和dy
的倍数。当然,这将需要一些基本的输入验证,但它将保证实际网格与用户指定的网格完全相同,点始终在边缘开始和结束。
答案 2 :(得分:0)
您的输入显然不能保证与lx
的{{1}}的整数倍兼容,因此您的问题。您必须因此需要兼容的输入,理想情况下,将dx
作为输入,nx
或dx
,在您的应用程序中更有意义。
或者,您可以将用户输入视为指南,即
lx