Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 生成等距点栅格_C++_Algorithm - Fatal编程技术网

C++ 生成等距点栅格

C++ 生成等距点栅格,c++,algorithm,C++,Algorithm,我目前有一个生成点网格的算法。它以x(lx)和y(ly)的长度以及增量或增量(dx和dy)的形式接收用户的输入,以将点隔开。我需要点始终在由lx和ly定义的边界正方形的边上开始和结束。我尝试了几种方法: 边界正方形的起始边定义为: double startx = lx / -2.0, starty = ly / -2.0; 我的第一种方法确定点数和轮数: int numintervalx = round(lx / dx), numintervaly = round(ly / dy); 我

我目前有一个生成点网格的算法。它以x(
lx
)和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);

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

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

用于(int i=0;i要求用户为您提供
lx
ly
的值,分别是
dx
dy
的倍数。这当然需要一些基本的输入验证,但它将保证实际网格与用户指定的网格完全相同,点始终以f开头在边缘进行初始化。

您的输入显然不能保证与
lx
兼容,因为它是
dx
的整数倍,因此您的问题就出现了。因此,您必须要求输入是兼容的,最好是将
nx
作为输入,
dx
lx
,无论在您看来有什么意义你的申请

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

nx = int(ceil(lx/dx));    // get suitable number of points
dx = lx/nx;               // set suitable spacing to fit range exactly

将整数转换视为添加错误。在这种情况下,将转换为整数时添加的错误降至最低的方法是舍入。最坏的情况是,如果用户输入值,例如lx/dx为0.5,这意味着舍入错误为0.5。鉴于您的问题,这是您所能做的最好的方法


考虑将numpoints重命名为numentervals或其他名称,因为实际上你比numpoints多创建了一个点,这很奇怪。

点的数量无关紧要。重要的是密度。@Drise好吧,请参阅我的编辑---刚刚意识到这实际上是你自己的选择之一…@Drise为什么你对它不满意?生成如果网格中有
lx=ly=2
dx=dy=.85
则会产生相对较大的错误和可能的不必要的行为,并可能会让用户感到沮丧。对。它确实会产生较大的错误。它可能会让用户感到沮丧。在问题陈述的范围内,如果不改变数学规则,就无法对其进行任何处理。D记录它并继续,或者通过选择更好的界面或验证输入来改变问题。关于命名的观点很好。我还认为你也提出了一个观点,即如果用户决定使用非最佳生成值,那么他/她将不得不接受错误。